2017-01-24 4 views
0

私のソースコードを書かされたときに継続して失敗しました。 target_wordが間にスペースを入れずに2回書かれている場合を除いて、ほぼすべてのテストケースで動作するようです。すなわち、target_wordが「入力」でchanged_wordが「出力」である場合、プログラムは「inputinput」を「outputoutput」に変更し、 「入力」の他のサンプルを「出力」に変更しないでください。どうすればこの問題を解決できますか?プログラムは、対象の単語が二度

答えて

0
while(iss>>word) 

は、空白で区切られた単語をとり、wordに格納します。入力が「入力入力」の場合、ストリームは「入力」をwordに書き込み、スペースで停止します。次の反復で、次の「入力」が読み取られます。しかし、入力が "inputinput"の場合、最初の "input"を区切る空白がないので、 "inputinput"はwordに読み込まれます。これは "入力"には一致しませんが、1つには長すぎますので、置き換えは起こりません。

編集:私は混乱の一部を見ていると思います。 「海魚魚」の代わりに「魚」と置き換えて使用する「海魚魚釣り魚釣り」の出力を調べてみましょう。

Iteration 1: walrus != fish. No replacement. Line = "walrus fishfish fish tank" 
Iteration 2: fishfish != fish. No replacement. Line = "walrus fishfish fish tank" 
Iteration 3: fish == fish. Replace first fish. Line = "walrus birdfish fish tank" 
Iteration 4: tank != fish. No replacement.  Line = "walrus birdfish fish tank" 

第3の「魚」は、唯一認められた魚であったため、第1の「魚」を置き換えたものです。これは、stringstream>>

の代わりに、何を使用すべきかに関するヒントを提供します。

代わりに行を解析するstringstream>>を使用して、あなたはおそらくfind

auto pos = line.find(target_word); 
while (pos != string::npos) 
{ 
    line.replace(pos, target_word.length(), changed_word); 
    pos = line.find(target_word); 
} 

または単純あまり明らかに付着したほうが良いです:これはにつながること

while ((auto pos = line.find(target_word)) != string::npos) 
{ 
    line.replace(pos, target_word.length(), changed_word); 
} 

注意target_wordが無限ループの場合はtarget_word == changed_wordとなるので、常にtarget_wordを見つけて置き換えます。target_word。このケースは早期にチェックすることができ、プログラムはユーザーの入力を単に戻すだけの別のパスを入力することができます。ユーザーはその違いを知ることができません。