2017-07-25 12 views
1

タイトルには、文字列を別の文字列に置き換えるにはどうすればよいですか?たとえば、ユーザーは3つの入力を入力します。最初の入力は、プログラムが置き換える文字列です。 2番目はinput1を置き換える文字列です。 3番目は印刷される文字列です。その場合:1つの文字列のすべての出現をテキストストリームの別の文字列に置き換えます。

入力1 =ピーナッツ

入力2 =ココナッツ

入力3は=

出力を交換ピーナッツを置き換える:私はそれが、私のプログラムを開始している

を交換ココナッツを置き換えます同じ長さの単語だけを置き換えることができます。私は自分の問題を調べてみましたが、私はC/C++で新しくなって以来、与えられた解を理解できません。

char replacing[100]; 
char replacement[100]; 
char original[1000]; 
int count; 

cin >> replacing; 
cin >> replacement; 

while(! cin.eof()) 
{ 
    cin >> original; 

    char * pch; 


    pch = strstr (original, replacing); 

    count = strlen(replacement); 
    strncpy (pch, replacement, count); 


    cout << original << endl; 

} 
+2

C++を学びたい場合は、C++を習得してください。あなたの問題は[ここ](https://stackoverflow.com/questions/3418231/replace-part-of-a-string-with-another-string)で見つけることができます。あなたがCを学びたいなら、C言語だけを学び、 'strncpy'が何をしているのか調べてください。それを混ぜないでください。そうすればあなたはうまくやってしまう*両方の*方法。 – nvoigt

+1

'std :: string'を使ってみてください。サブストリングを見つけてその一部を置換するメンバ関数を持っています。また、入力ストリームからの読み込みも簡単です。 – Peter

+0

また、ループ状態の 'iostream :: eof'がなぜ間違っていると思われるのですか?(/ q/5605125) –

答えて

1

何について:

  • あなた最初のFind(もしあれば)、その文字列の出現
  • 使用ここでは2番目の文字列で

を発生を代用すること置き換えるものですそれはうまくいくはずです:

bool replaceFirst(string& input, const std::string& toBeReplaced, const std::string& replacement) { 
    size_t start_pos = input.find(toBeReplaced); 
    if(start_pos == std::string::npos) 
     return false; //substring not found! 

    input.replace(start_pos, toBeReplaced.length(), replacement); //found. now i can replace! 
    return true; 
} 

stringの代わりにcharの配列を使用しているので、置き換えがあなたを境界から外れないようにする必要があります(文字列の自動サイズ変更)。

+0

'from'はコードサンプルで定義されていないようです。 –

+0

@AlgirdasPreidžiusが修正されました。 –

+0

問題はまだ残っています: 'str.find(from);'。 –

0

重要な問題は、strncpyがメモリを割り当てない(または解放する)ことです。つまり、replacementreplacingより短い場合、replacingの部分は上書きされません。同様にreplacementが長ければ、replacingの終わりを超えて上書きされます。

すでに述べたように、std::string(または、Qtがお茶の場合はQtのQStringのような他のC++文字列クラスを使用する方が良いでしょう)。

もう一つの小さなことは、ストリームと一般的にはかなりストリームがどのような状態だけでなく、eof失敗である場合、これが終了します

while (cin >> original) { 

ような何かを書く、ちょうどeofをチェックしないことが最善です。

関連する問題