2016-10-16 3 views
-1

次の関数を使用して、2つの文字列(char * hide、char * phrase)を渡すことができます。 *フレーズは全体的な文字列で、* hideは単語の中のすべての文字を '*'で置き換えることによって、どの単語(繰り返し可能)を打ち切らなければならないかです。現在は、* hideの最初の文字を見つけ出し、文字列の隣にいなくても*隠す単語の2番目の文字を探します。strlenを使用して文字列内の指定された単語を削除する

*phrase = 'hello my name is' 

*hide = 'lame' 

result = 'he*lo my n*** is' 

    { 
     int i, j=0; 
     int lengthPhrase = strlen(phrase); 
     int lengthCensor = strlen(hide); 
     for (i = 0; i < lengthPhrase; i++) { 
      if (phrase[i] == hide[j]) { 
       phrase[i] = '*'; 
       j++; 
       } 
      } 
     } 

全体の単語を叩いて正しく動作するように問題はどこにありますか?

ありがとうございます。

+2

です。2つのこと:C++の文字列リテラルは、文字の定数配列です。 1つを(ポインタで)変更しようとすると、*未定義の動作になります*。もう一つは、C++で本当にプログラミングをしているなら、前の問題を解決する 'std :: string'を使うべきです。 –

+0

また、複数の文字のリテラルも間違って使用しています。おそらく、あなたが文字列リテラル割り当てを働かせることができなかったので、コンパイルされるまであなたは事をランダムに変更しました。残念ながら、この「推測によるプログラミング」のプロセスは、最終結果が間違っているという事実によってひどく実証されました。どの本を使ってC++を学んでいますか? –

+0

'std :: search'を使用して、ターゲット文字列の一致を検索します。 –

答えて

0

私はあなたの質問を理解していないようですので、私は、これはあなたが探しているものであるかどうかを確認するための関数を作ることを考えた:あなたのテストケースに基づいて

string phrase = "hello my name is" 

    string hide = "lame"  

    //strikeout function 
    void strikeout(string phrase, string hide) 
    { 
     for (int i = 0; i < hide.size(); i++) 
     { 
      for (int j = 0; j < phrase.size(); j++) 
      { 
       if (hide[i] == phrase[j]) 
       { 
        phrase[j] = '*'; 
       } 
      } 
     } 
     cout << phrase << endl; 
    } 

出力:「H *** o * yn ***は "