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