■
前回書いた文字列を操作する関数をちょっと変えてみました。
変わったのは、文字列の長さ取得位置です。
/*! * @brief バッファ内の特定の文字を削除します。 * * @param buff 文字列が格納されたバッファ * @param str 消去する文字 * * @return length 削除後の文字列の長さ */ size_t DeleteString( char *buff, const char *str ) { char *pPoint; // アドレス格納ポインタ size_t length, strSize; // バッファサイズ length = strlen( buff ); strSize = strlen( str ); // 使いまわすのでここで計算 /* 指定した文字列のアドレスを取得し、 * 指定した文字列がなくなったらwhile()を抜ける */ while( (pPoint = strstr( buff, str )) != NULL ){ buff = pPoint; // アドレスコピー pPoint += strSize; // 文字数分移動する strcpy( buff, pPoint ); // 文字列コピー length -= strSize; // 減らした分、長さを減らす } return length; }
この処理を図で説明すると、
'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | '\0' |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
上記のような文字列があり、例えば'c'を消したいと思います。
この関数を使うと、
DeleteString( str, "c" );
まず、strstr( str, "c" );で"c"の位置を取得します。
ここでは2が返ってきます。
本当はメモリ上のアドレスが返ってくるので、0x********みたいのが返ってきますが、
今回は説明ということで省略。
pPointに2を格納します。
bufのアドレスをpPointに格納されているものに変更します。
そして、今回は1文字なので1つアドレスを変更します。→pPoint = 3;
最後に、strcpy()でコピーします。
つまり、
str
'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | '\0' |
---|---|---|---|---|---|---|---|---|---|---|---|---|
↑ | ↑ | ↑ | ↑ | ↑ | ↑ | ↑ | ↑ | ↑ | ↑ | ↑ | ↑ | |
'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | '\0' |
pPoint
こうして、"c"が消えたことになります。
説明が下手ですみませんT-T;