cin.ignore()
なぜそれらが必要なのか、いつそこに置くべきなのかを正確に知らずに、あまりにも多くのことを投げかけているように私には思えます。
cin.ignore()
「入力を正しく機能させる」必要がある一般的な状況が 2 つあります。
- フォーマットされた入力とフォーマットされていない入力を混在させる場合。
- フォーマットされた入力エラーから回復します。
どちらの場合も、入力バッファから偽の文字を取り除く必要があります。そのような文字が存在しない場合 (これはおそらくプログラムで発生することです)、cin.ignore()
実行を一時停止してユーザー入力を待ちます。
(ignore()
デフォルトでは1文字だけ「食べる」でしょうが、それが何であれ、実行は改行が見つかるまで一時停止されますcin
.
ケース 1:
cin.ignore()
フォーマットされた入力操作 (つまり、演算子を使用) を実行した後に、フォーマットされていない入力操作 ( などgetline
) を実行する場合、呼び出しが必要になることがよくあります。>>
これは、>>
オペレーターが入力バッファーに改行を残すために発生します。フォーマットされた入力操作のみを実行する場合は問題ありません (デフォルトでは、入力を解釈しようとする前にすべての空白をスキップします)。しかし、後でフォーマットされていない入力を行う場合は問題になります。getline
デフォルトでは、改行が見つかるまで読み取ります。 「偽の改行」が残っていると、すぐに読み取りを停止します。
したがって、ここでは通常cin.ignore(...)
、入力バッファが空であることを保証して、行で行う最後のフォーマットされた入力操作の直後に、改行を取り除くために call を呼び出します。その後、getline
バッファを空のままにしておけば、恐れることなく直接呼び出すことができます。
代わりに、コードで行うように、 anyの前に置くのは悪い考えです。入力バッファーがクリーンであることgetline
につながるコードパスが存在する可能性があるため、呼び出しがブロックされます。getline
ignore
ケース 2:
フォーマットされた入力操作でエラーがistream
発生すると、バッファに「悪い」文字が残ります。そのため、操作を再試行すると、犯罪者がまだそこにいるため、際限なくスタックします。問題のある行全体を入力バッファーから削除する、通常のclear()/ignore()
イディオムが役に立ちます。
繰り返しますが、clear()/ignore()
シーケンスをランダムに配置するのではなく、フォーマットされた入力操作 (ストリームの failbit を設定する) から入力エラーを取得した後にのみ配置します。
現在、これらのケースを除けば、使用するのは一般的ではありcin.ignore()
ません (実際に文字をスキップしたい場合を除きます)。「安全のために」ランダムに広めないでください。そうしないと、説明した問題が発生します。