2016-09-04 12 views
0

私は、各行の中でもっとも使われている単語を取り、それを1行に印刷するプログラミング割り当てを解決することに近いと感じています。だから、例えば:なぜループは終了しないのですか?

I am a man, am right? 
I don't know if i like that. 
It's okay to not feel okay. 

は印刷されます:

(句読点およびケースが割り当てのために無視される)「私は大丈夫だ」これは私がこれまでにやっていることですが、問題はwhileループということです行をスキャンすることは決して終了しないので、外部forループの出力を決して出力しません。誰が私が間違っていたのか分かりますか?

string line; 
vector<string> result; 
while(getline(cin,line)){  //on each line 

} 
+0

この問題を再現するには、本当にこれらのコード行が必要でしたか? [MCVE] –

答えて

1

現在、プログラムは、入力が終了したことを示すEOF文字を待機しています。これを実行してコマンドラインから入力を入力している場合は、* nixではCtrl + Dを、ウィンドウではCtrl + Zを押して手動でEOFを挿入できます。これにより、プログラムはgetl​​ineループから抜け出すことになります。

そうしたくない場合は、getlineループから抜け出す方法が必要です。そうしないと、そのループで引き続き実行されます。素敵なアイデアはとても回Enterキーを押し、空行を検出することがあります

は、ループ終了:書かれたよう

while(getline(cin,line)){  //on each line 
    if(line == "") 
     break; 
    ... 
} 
+0

これを行う方法はありますか?私はちょうど入力を入れ、一度Enterを押して結果を得ますか? –

+0

これをコマンドラインから(stdinに)入力していると仮定して、Enterを押して各行を終了しますか?そうであれば、行が完成したことを意味する新しい行と新しい行を区別する何らかの方法を決定する必要があります。 – js441

+0

段落全体が入力された後、Enterキーを押します。私は入力が一度だけ押されるように道が必要です。私はとても近いと感じています! –

2

あなたのループが正しいことを。あなたはちょうど入力の終わりを示す方法を知らない。プログラムが進行するのを待ってそこに座っていますが、プログラムはそこに座って、あなたにそれ以上のインプットを与えるのを待っています。

EOF文字/信号/記号を送信してループを終了するには、Ctrl + D(Linux)またはCtrl + Z(Windows)を押します。

このように、ファイルリダイレクトやパイプなどの一般的なシェル技術もすべて動作します。

ダブル改行やいくつかのマジックコマンドのような人工的な手段を導入することは、従来とは異なり、プログラムを自動化するのが難しくなります。 (あなたのプログラムでは、改行の1つがコピー/貼り付けではなくキーボードヒットから来ていることを魔法のように知っていますが、それはできません。可能な限り標準的なプラクティスに従います。

+0

これをコード化する方法はありますか?そうする必要はありませんか?段落を一度に入力してからenterを押すと、結果が印刷されます。 –

+0

@ Team.Coco:プログラムは、3つの行を常に正確に受け入れたくない場合を除いて、3つめの入力が最初の2つの入力と異なって動作するようにする方法はありません。私が説明したことは正しい方法であり、本当に簡単です!あなたはそれが苦難だと示唆しているようです。なぜ私は分からない。 –

+0

ユーザーが入力するのは1つだけです。入力段落は一度に与えられます –

関連する問題