- 締切済み
置換について
C言語を勉強中です。質問させてください。 data = "abcwofjiabcajd9abfuabcaoefabc"; という変数があったとします。 変数dataに"abc"が存在したら"xxx"に書き換えたいのですが、 どうのようにすればいいのでしょうか? ------------------------------------ こうしたいです↓。 data = "xxxwofjixxxajd9abfuxxxaoefabc"; ------------------------------------ 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- gimmick
- ベストアンサー率49% (134/270)
#2さんのコードで一点だけ気になる所があります。それは、 >char *data = "abcwofjiabcajd9abfuabcaoefabc"; という一文です。この場合、後ろのfor文で文字列リテラルを書き換える事になるかと思いますが、文字列リテラルは一般的には書き換え不可です。環境によってはクラッシュする可能性があります。素直に配列を使って char data[] = "abcwofjiabcajd9abfuabcaoefabc"; としておくと良いでしょう。(他の部分はそのままで構いません。)
- liar_adan
- ベストアンサー率48% (730/1515)
#1です。 >恐らくですが、上記のソースだと無限ループになるのですか? >書き換えた文字列を見ていないような気が・・・ その点は大丈夫です。 回答した後気になって、実際にコンパイルして試してみました。正常に動きます。 >while(p = strstr(data, "abc"))memcpy(p, "xxx", 3); このコードで何をやっているか説明いたしますと、 ・strstr()によって"abc"を検索している。あればそのポインタを返し、なければNULLを返す。 ・NULLを条件として判断すると、falseになる。検索するものが文字列dataの中に無ければwhileから出る。あれば動作する。 ・while文の条件判断の中で、検査とpへの代入を同時に行っている。Cでは許される書き方。(ただしあまり好ましくはない) ・ポインタpは文字列dataのある位置("abc"が見つかった位置)を指している。ここに対して文字列コピーをすると文字列dataが変更される。 というわけで動作はするのですが、 書き方的にはあまりよくなかったですねえ。 #2のコードの方がいいです。基本に忠実で。効率の点でも。 こっちは「こういう書き方もあるんだな」と参考だけにしてください。
- me_no_car
- ベストアンサー率24% (22/90)
C言語は文字列処理苦手ですからねえ。 こんな置換でも結構めんどいです。 こんな感じでいかかがでしょう。 #include <stdio.h> int main() { char *data = "abcwofjiabcajd9abfuabcaoefabc"; char *wk; for(wk=data ; *wk ; wk++ ){ if( !strncmp(wk , "abc" , 3) ){ strncpy( wk , "xxx" , 3 ); } } printf("data = [ %s ] \n" , data ); }
- liar_adan
- ベストアンサー率48% (730/1515)
検索には、標準関数strstr()を使います。 文字列のコピーには、通常はstrcpyを使いますが、 strcpy()だと、文字列最後の\0までコピーされてしまうので適当ではありません。 この場合memcpy()かstrncpy()を使います。 コンパイルしてないので自信はなしです。 #include <string.h> char *p; while(p = strstr(data, "abc"))memcpy(p, "xxx", 3);
補足
早速の返信有難うございます。 恐らくですが、上記のソースだと無限ループになるのですか? ------------------------- #include <string.h> char *p; data="abcadjfoiabapdoabcajodjfiabc" while(p=strstr(data, "abc")){ memcpy(p, "xxx", 3); } →"xxxadjfoiabapdoxxxajodjfixxx" ----------------------------- あまりC言語は詳しくないのですが、 書き換えた文字列を見ていないような気が・・・ 間違っていたらすみません。 宜しくお願い致します。