dポイントプレゼントキャンペーン実施中!

C言語を勉強中です。質問させてください。

data = "abcwofjiabcajd9abfuabcaoefabc";
という変数があったとします。
変数dataに"abc"が存在したら"xxx"に書き換えたいのですが、
どうのようにすればいいのでしょうか?
------------------------------------
こうしたいです↓。
data = "xxxwofjixxxajd9abfuxxxaoefabc";
------------------------------------
宜しくお願い致します。

A 回答 (4件)

#2さんのコードで一点だけ気になる所があります。

それは、

>char *data = "abcwofjiabcajd9abfuabcaoefabc";

という一文です。この場合、後ろのfor文で文字列リテラルを書き換える事になるかと思いますが、文字列リテラルは一般的には書き換え不可です。環境によってはクラッシュする可能性があります。素直に配列を使って

char data[] = "abcwofjiabcajd9abfuabcaoefabc";

としておくと良いでしょう。(他の部分はそのままで構いません。)

参考URL:http://www.catnet.ne.jp/kouno/c_faq/c16.html#6
    • good
    • 0

#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のコードの方がいいです。基本に忠実で。効率の点でも。
こっちは「こういう書き方もあるんだな」と参考だけにしてください。
    • good
    • 0

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 );

}
    • good
    • 0

検索には、標準関数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言語は詳しくないのですが、
書き換えた文字列を見ていないような気が・・・
間違っていたらすみません。
宜しくお願い致します。

補足日時:2003/04/09 18:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!