我是一名学习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)) 在输入错误的输入时程序进入无限循环。 请帮我解释一下这种现象,正如我所说的教科书所说,上面输入的代码应该按预期工作。
谢谢
答案 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())
作为备份,以防止在提示时输入错误类型导致崩溃