这里我试图从用户那里得到一个整数,在输入正确时循环。
输入非整数值(例如“dsdfgsdg”)后,cin.fail()返回true,如预期的那样,while循环体开始执行。
这里我使用cin.clear()重置cin的错误标志;和cin.fail()按预期返回false。
但是下一次调用cin不起作用并重新设置错误标志。
有什么想法吗?
#include<iostream>
using namespace std;
int main() {
int a;
cin >> a;
while (cin.fail()) {
cout << "Incorrect data. Enter new integer:\n";
cin.clear();
cin >> a;
}
}
答案 0 :(得分:4)
在cin.clear()
之后,您执行此操作:
#include <iostream> //std::streamsize, std::cin
#include <limits> //std::numeric_limits
....
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
上面做的是清除仍然留在那里的任何字符的输入流。否则cin将继续尝试读取相同的字符并失败
答案 1 :(得分:2)
作为一种风格,喜欢这种方法:
int main()
{
int a;
while (!(std::cin >> a))
{
std::cout << "Incorrect data. Enter new integer:" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
答案 2 :(得分:1)
cin.clear()没有清除缓冲区;它会重置错误标志。因此,您仍然会在缓冲区中输入sting,并且在清除cin缓冲区之前,代码将不允许您输入新数据。 cin.Ignore()
应该做的伎俩