cin条件检查错误
Posted
技术标签:
【中文标题】cin条件检查错误【英文标题】:cin condition checking error 【发布时间】:2013-01-28 15:00:17 【问题描述】:我是一名学习 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,如果我把相同的概念放在一个循环中 而 (!(cin >> x)) 输入错误的输入后,程序进入无限循环。 请帮我解释一下这种现象,因为我所遵循的教科书说上面输入的代码应该按预期工作。
谢谢
【问题讨论】:
clear()
第一,ignore()
第二。
谢谢老兄!!现在工作:)
为什么其他方式不起作用??
【参考方案1】:
cin
是一个输入流。如果发生错误cin
进入我们称之为“发生错误”的状态。虽然在此状态下无法进行字符输入,但您从输入流中收集字符的请求将被忽略。使用clear()
,您可以清除错误,输入流不再忽略您。
这里是忽略函数原型
istream& ignore ( streamsize n = 1, int delim = EOF );
此函数从输入流中获取字符并丢弃它们,但如果您的流忽略您,您将无法获取任何字符,因此您必须首先clear()
流然后ignore()
它。
另外,附注:如果有人输入,例如"abc"
,在第一个输入请求中,您的cin
只得到一个字符'a'
和"bc"
留在缓冲区中等待拾取,但对 cin
的下一次调用得到了 'b'
和 'c'
留在缓冲区中,因此您再次遇到错误。
这个例子的问题是cin.ignore()
如果没有参数被传递给它只会忽略clear()
之后的1个字符。第二个cin
得到'c'
所以你还是有问题。
这个问题的一般解决方案是调用
cin.ignore(10000, '\n');
第一个数字必须是一个你不希望有人输入的巨大数字,我通常输入 10000。
此调用确保您从错误输入中拾取所有字符,或者确保您在按下输入之前拾取每个字符,这样您的输入流不会两次进入“错误发生”状态。
【讨论】:
感谢 CodeJunkie,我在更正代码后遇到了这个问题。经过一番谷歌搜索,我找到了 cin.sync(),它摆脱了整个现有的输入流。我用 cin.ignore() 代替了它,效果也很好!!。【参考方案2】:您可能还想尝试 if ( std::cin.fail() )
作为备用,以防止在提示时输入错误类型而导致崩溃
【讨论】:
您能否详细说明这有什么帮助?以上是关于cin条件检查错误的主要内容,如果未能解决你的问题,请参考以下文章
PHP:检查 MySQL TABLE 是不是已作为错误条件存在? [复制]