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",在第一个输入请求中,您cin只会得到一个字符,该字符'a'"bc"在缓冲区中等待被拾取,但下一次调用cin获取'b''c'留在缓冲区中,因此您再次遇到错误。

这个例子的问题是cin.ignore()if no arguments 被传递给它只会忽略 you 之后的 1 个字符clear()。第二个cin得到了'c',所以你仍然有问题。

这个问题的一般解决方案是调用

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

第一个数字必须是一个你不希望有人输入的巨大数字,我通常输入 10000。

此调用确保您从错误输入中拾取所有字符,或者确保在按下输入之前拾取每个字符,这样您的输入流不会两次进入“错误发生”状态。

于 2013-01-28T16:41:09.457 回答
0

您可能还想尝试 if ( std::cin.fail() )

作为备份,以防止在提示时输入错误类型而导致崩溃

于 2014-01-29T02:41:05.567 回答