C++相談室 part60
■ このスレッドは過去ログ倉庫に格納されています
0482デフォルトの名無しさん
2008/02/15(金) 02:47:53size_t src_length = wcslen(src); //元文字列の長さ
size_t before_length = wcslen(before); //検索文字列の長さ
if(src_length < before_length || before == L"" || before == after) return src;
size_t after_length = wcslen(after); //置換文字列の長さ
int shift = after_length - before_length; //置換による移動数
wchar_t *start = src; //検索開始位置
wchar_t *hit; //見つかった位置
int match; //マッチ回数
//マッチ回数を求める
for(match = 0; (hit = wcsstr(start, before)) != NULL; match++) start = hit + before_length;
if(match == 0) return src;
//長くなる分だけメモリを確保
if(shift > 0){
wchar_t *tmp;
if((tmp = (wchar_t *)realloc(src, (src_length + shift * match + 1) * sizeof(wchar_t))) != NULL) src = tmp;
else return src;
}
//置換部
start = src;
for(int i = 0; i < match; i++){
hit = wcsstr(start, before);
wmemmove(hit + after_length, hit + before_length, wcslen(hit) - before_length + 1);
wmemmove(hit, after, after_length); //置換
start = hit + after_length; //次の検索開始位置
}
return src;
}
■ このスレッドは過去ログ倉庫に格納されています