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