[YukiWiki] [[someReplace()]]

[ トップ | 一覧 | 編集 | 差分 | 単語検索 | 最終更新 | ]

[[someReplace()]]とは何か



/*

	someReplace 

	src の中の str0 をすべて str1 に置き換えた文字列を des に入れて返す。 
	des は呼び出し側で十分なメモリ取っといてな 
 */ 
int someReplace(char * src, char * des, char * str0, char * str1 ) 
{ 
	char temp[SIZE_BUF]; 
	int str0_length = strlen(str0); 
	int str1_length = strlen(str1); 

	/* 置き換える文字列を取っとく */ 
	strcpy( des, src ); 

	/* まだ文字列が残っていればループ */ 
	while (des) { 

		/* 置き換えるべき文字列の位置を取得 */ 
		des = strstr( des, str0 ); 
		if (des == NULL) { 
			break; 
		} 

		/* 部分文字列以後の文字列を一時保存 */ 
		strcpy(temp, des + str0_length); 

		/* des に書き戻す */ 
		strcpy(des, str1); 
		strcat(des + str1_length, temp); 

		/* 部分文字列以後の文字列の位置を返す */ 
		des += str1_length; 
	} 

	return 1; 
} 


doReplace のを真似て

int someReplace(char * src, char * des, char * str0, char * str1 ) {

	int str0_length = strlen(str0); 
	int str1_length = strlen(str1); 

	/* 置き換える文字列を取っとく */ 
	strcpy(des, src); 

	/* まだ文字列が残っていればループ */ 
	while (des) { 

		/* 置き換えるべき文字列の位置を取得 */ 
		des = strstr(des, str0); 
		if (des == NULL) { 
			break; 
		} 

		/* 後ろの部分を目的の位置まで移動 */
		memmove(des + str1_length, des + str0_length, strlen(des+str0_length)+1);

		/* str1をはめ込む */
		memcpy(des, str1, str1_length);

		/* 部分文字列以後の文字列の位置を返す */ 
		des += str1_length; 
	} 

	return 1; 
} 


コピー回数を減らした

 int someReplace(char * src, char * des, char * str0, char * str1 ) 
 { 
	int str0_length = strlen(str0); 
	int str1_length = strlen(str1); 
	char * p;
	int head_len;

	/* str1が見つかるあいだループ */
	while ( p = strstr(src, str0) ) 
	{
		/* str0の前までをコピー */
		head_len = p - src;
		memcpy( dest, src, head_len );
		dest += head_len;

		/* str1をはめこむ */
		memcpy( dest, str1, str1_length );
		dest += str1_length;

		/* str0の長さを飛ばし、次に読む地点に進める */
		src = p + str0_length;
	}

	strcpy( dest, src );

	return 1; 
 } 


YukiWiki 1.6.2 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by aki.