3

私はC++を学んでいる初心者プログラマーです。cin コマンドに問題があります。以下のプログラム セクションでは、最初の cin コマンドで間違ったタイプを入力すると、プログラムは次の cin コマンドをまったく実行せず、残りのプログラムを実行します。

//start
#include <iostream>
using namespace std;
int main()
{
    int x=0;
    cout << endl << "Enter an integer" << endl;

    //enter integer here. If wrong type is entered, goes to else
    if (cin >> x){
            cout << "The value is " << x << endl;
    }
    else {
         cout << "You made a mistake" << endl; //executes
         cin.ignore();
         cin.clear();
    }
    cout << "Check 1" << endl; //executes
    cin >> x;                  //skips
    cout << "Check 2" << endl; //executes
    cin >> x;                  //skips
    return 0;                  
}
//end

if else の代わりに、同じ概念をループ while (!(cin >> x)) に入れた場合、プログラムは間違った入力を入力すると無限ループに入ります。私がフォローしているテキストブックには、上記のコードが意図したとおりに機能するはずであると書かれているため、この現象の説明を手伝ってください。

ありがとうございました

4

2 に答える 2

3

cin入力ストリームです。エラーが発生cinした場合は、「エラー発生」状態と呼びましょう。この状態では文字入力はできませんが、入力ストリームから文字を収集する要求は無視されます。エラーをクリアすると、入力ストリームはあなたclear()を無視しなくなります。

これが無視関数のプロトタイプです

istream&  ignore ( streamsize n = 1, int delim = EOF );

この関数は、入力ストリームから文字を取得して破棄しますが、ストリームがあなたを無視している場合は文字を取得できないため、最初clear()にストリームを取得してから、それを実行する必要がありますignore()

また、側面の注意事項:誰かが入力した場合、たとえば"abc"、最初の入力要求で、ピックアップされるのを待っているバッファ内にあるcin1つの文字だけを取得しますが、次の呼び出しはバッファ内にとどまり'a'ます、そのため、再びエラーが発生します。"bc"cin'b''c'

この例の問題は、cin.ignore()引数が渡されない場合、あなたの後に1文字しか無視されないことですclear()。そして2番目cinが取得'c'するので、まだ問題があります。

この問題の一般的な解決策は、

cin.ignore(10000, '\n');

最初の数字は、誰かが入るとは思わない巨大な数字でなければなりません。私は通常10000を入れます。

この呼び出しにより、誤った入力からすべての文字を取得するか、Enterキーが押される前にすべての文字を取得して、入力ストリームが「エラー発生」状態に2回入らないようにします。

于 2013-01-28T16:41:09.457 に答える