2

プログラムで何らかの理由で、特定の場所に到達したときに、Enter送信するために 2 回押す必要があります。入力をスキップしないように clear を追加し、バッファーに余分な文字が保持されないように ignore() を追加しました。入力を入力すると、新しい行にドロップダウンし、Enterもう一度押すと入力が入力され、問題なくプログラムが続行されますが、なぜだろうと思います。コード スニペットを次に示します。

    cin.ignore();
    cout << "Enter Student Major (ex. COSC): ";
    cin.getline(student.major, 6);

    for(int i = 0; i < sizeof(student.major); i++)
        student.major[i] = toupper(student.major[i]);

    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

助言がありますか?

4

3 に答える 3

8

cin.ignore()なぜそれらが必要なのか、いつそこに置くべきなのかを正確に知らずに、あまりにも多くのことを投げかけているように私には思えます。

cin.ignore()「入力を正しく機能させる」必要がある一般的な状況が 2 つあります。

  1. フォーマットされた入力とフォーマットされていない入力を混在させる場合。
  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()ません (実際に文字をスキップしたい場合を除きます)。「安全のために」ランダムに広めないでください。そうしないと、説明した問題が発生します。

于 2012-11-26T00:04:27.367 に答える
0

cin.ignore(numeric_limits<streamsize>::max(), '\n');入力に​​aが必要だと思いますが\n、見つからないので、Enterもう一度押す必要があります。

于 2012-11-25T23:58:49.807 に答える
0

答えはここにあります。

n 文字が抽出されて破棄されるか、文字 delim が見つかったときのいずれか早い方で、抽出は終了します。後者の場合、delim 文字自体も抽出されます。

したがって、あなたの場合、プログラムは'\n'文字が受信されるまで続行されません。

于 2012-11-26T00:01:06.457 に答える