[英]Why is this code snippet infinitely looping?
我对编程很新,而且我试图从cin
过滤输入(没有特别的原因;它是我现在知道的唯一输入法),这样一个人只能输入1-10并得到“正面“回应。 这是我的代码:
#pragma region Check cin is a valid input (an integer between 1 and 10, not a string or number out of range)
int input;
bool valid2=false;
while (!valid2)
{
cout << "Enter an integer (1-10): ";
cin >> input;
if (!cin || input > 10 || input < 1)
{
cout << "Error: Invalid. Try again." << endl << endl;
cin.ignore(numeric_limits<streamsize>::max());
cin.clear();
}
else
{
valid2 = true;
}
}
#pragma endregion
忽略“pragma”,我有一个带有块的测试脚本,用于每个小实验,以节省我的时间,这就是我们在它们不再有效时将它们折叠的方式。
我的问题(以及其他)是当我输入一个非整数(如f
,它会无限循环"Error: Invalid. Try Again"
,我无法弄清楚原因。 我想也许因为input
被定义了,当它回来时它正在经过cin
。 但我检查了一个孤立的例子,并且cin
让我在继续之前专门重新定义input
。
补充工具栏:说到pragma
,有没有人在c ++中有更好的方法呢? 除了制作单独的方法,因为我的大多数测试都可以在main
运行。
编辑:我已经切换cin.ignore(...)
和cin.clear()
,现在程序可以正确过滤输入; 但是现在,它根本没有回头。 给我"Error: Invalid. Try again."
,它挂起它应该再次要求我输入整数。
您的原始代码有两个问题(至少就我发现的情况而言 - 不保证不再存在):
cin.clear()
和cin.ignore()
- cin.clear()
的顺序应该在cin.ignore()
之前,否则cin.ignore()
将不执行任何操作。 cin.ignore(numeric_limits<streamsize>::max());
正在读取,直到分隔符,默认为EOF
- 换句话说,无论缓冲区中有什么输入,或者之后输入,它都会继续接受它。 要解决这两个问题,请使用此:
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
这将读到当前行的结尾,这可能更符合您的要求。
哦,改变:
cin >> input;
if (!cin || input > 10 || input < 1)
至:
if (!(cin >> input) || input > 10 || input < 1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.