■
文字列操作はいろいろと面倒です。
ただ、今現在文字列を多く使うことに触れているので、
ちょっとまとめてみた。
文字列の文字を消したり、置き換えたりするものです。
Javaだと、
文字を置き換える・・・replace( str1, str2 )
前後の空白スペース削除・・・trim()
など、文字列操作に関してすでに用意されていますが、
Cには無いので自前で作るしかない。
以下作ってみたモノ。
バグあるかも・・・
/*! * @brief バッファ内の特定の文字を削除します。 * * @param buff 文字列が格納されたバッファ * @param str 消去する文字 * * @return length 削除後の文字列の長さ */ size_t DeleteString( char *buff, const char *str ) { char *pPoint; // アドレス格納ポインタ size_t length; // バッファサイズ length = strlen( buff ); /* 指定した文字列のアドレスを取得し、 * 指定した文字列がなくなったらwhile()を抜ける */ while( (pPoint = strstr( buff, str )) != NULL ){ buff = pPoint; // アドレスコピー pPoint += strlen( str ); // 文字数分移動する strcpy( buff, pPoint ); // 文字列コピー length -= strlen( str ); // 減らした分、長さを減らす } return length; } /*! * @brief バッファ内の特定の文字を、指定した文字に変換します。 * * @param buff 文字列が格納されたバッファ * @param str1 変更前の文字 * @param str2 変更後の文字 * * @return length 削除後の文字列の長さ */ size_t ReplaceString( char *buff, const char *str1, const char *str2 ) { char *pPoint; size_t length, stlen1, stlen2; length = strlen( buff ); stlen1 = strlen( str1 ); stlen2 = strlen( str2 ); /* 指定した文字列のアドレスを取得し、 * 指定した文字列がなくなったらwhile()を抜ける */ while( (pPoint = strstr( buff, str1 )) != NULL ){ memmove( pPoint + stlen2, pPoint + stlen1, strlen( buff ) - (pPoint + stlen1 - buff ) + 1); memcpy( pPoint, str2, stlen2); length += stlen2 - stlen1; // 文字の長さ調整 } return length; }
なぜ、returnでサイズを返しているかというと、
ファイルを開き、そのファイルの文字列を操作して書き込む。
という操作において、
fwrite( buf, size, length, fp );
で書き込む際に、文字消去や、置き換えをするとlengthの値が変わってしまうので、
変えた分、長さを返してみました。
ReplaceString()とか、書いてて少し怪しいなと思いました・・・。
要確認ですね^^;