我知道有很多这样的问题,答案正确。但是,我在这里关注的是为什么我对以下代码的解释是错误的。
#include <iostream>
#include <string>
int main(){
std::cout << "Write an integer:\n>";
int n;
std::cin >> n;
while (!std::cin) {
std::cout << "ERROR, you are allowed to enter an integer only.Try again!\n>";
std::cin.clear();
//std::cin.ignore(10000,'\n');
std::cin >> n;
}
std::cout << "\nYou entered the integer: " << n;
return 0;
}
现在发生的事情是,如果我输入像'h'这样的字符,它将继续显示错误句子。
我们假设我没有运行该程序。我会解释上面的代码如下:
当我输入无效输入(如'h')时,cin将失败,while条件将变为true。另外,输入缓冲区中会有一个'\ n'字符
现在程序将显示错误消息并清除 cin错误标志。现在cin返回到原始状态,能够再次获得输入
现在输入缓冲区中有一个换行符,cin会跳过它,允许用户再次输入另一个字符。所以程序应该工作正常(但实际上它没有!)
为什么它不像我上面解释的那样工作?
答案 0 :(得分:2)
如果您取消注释std::cin.ignore
,则代码应该有效。如果没有ignore
,则'h'
不会从序列中删除,因此您会尝试一次又一次地阅读它。
答案 1 :(得分:0)
嗯,C中的字符(我想猜的是C ++)实际上是小整数,所以如果你想检查输入是否是数字(或包含数字),你应该检查它是否来自types.h(IIRC)的函数。我不确定是否有更好的,更多的C ++&#39; ish方法。
你在这里基本上做的是检查std:cin是否为真。您确定空流或仅包含换行符的流是否为假?