[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.