cin条件检查错误

时间:2013-01-28 15:00:18

标签: c++

我是一名学习c ++的初学程序员。我对cin命令有一个唠叨的问题。 在下面的程序部分中,如果我在1st 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&gt;&gt; x)) 在输入错误的输入时程序进入无限循环。 请帮我解释一下这种现象,正如我所说的教科书所说,上面输入的代码应该按预期工作。

谢谢

2 个答案:

答案 0 :(得分:2)

cin是输入流。如果发生错误cin进入一个让我们称之为“错误发生”的状态。在此状态下,不能进行字符输入,将忽略从输入流中收集字符的请求。使用clear()清除错误,输入流停止忽略您。

这是忽略函数原型

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

此函数从输入流中获取字符并丢弃它们,但如果您的流忽略了您,则无法获取任何字符,因此您必须首先clear()流然后ignore()它。

另外,旁边有一条注释:如果有人在第一个输入请求中输入了"abc",那么cin只会获得一个'a'和{{1}的字符停留在等待接收的缓冲区中,但下一次调用"bc"会使cin'b'停留在缓冲区中,因此您最终会出错。

这个例子的问题是'c'如果没有参数传递给它只会忽略cin.ignore()之后的1个字符。第二个clear()得到cin,所以你仍然有问题。

此问题的一般解决方案是致电

'c'

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

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

答案 1 :(得分:0)

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

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