我对编程很新,我正在尝试过滤来自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."
后,它会挂起 再次要求我输入整数的位置。
答案 0 :(得分:2)
您的原始代码存在两个问题(至少在我发现的情况下 - 不保证不再存在):
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)