这里我试图从用户那里获取一个整数,在输入正确时循环。
输入非整数值(例如“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;
}
}
在
cin.clear()
之后,您可以执行以下操作:
#include <iostream> //std::streamsize, std::cin
#include <limits> //std::numeric_limits
....
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
上面的作用是丢弃流中仍然保留的所有字符,直到
EOF
或直到它丢弃分隔符(在本例中为 \n
)。
如果不这样做,
cin >> a;
将继续读取相同的非整数字符,并且您的程序将继续循环。
就风格而言,更喜欢这种方法:
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');
}
}
cin.clear() 不会清除缓冲区;它重置错误标志。因此,您仍然会在缓冲区中输入您输入的字符串,并且在清除 cin 缓冲区之前,代码将不允许您输入新数据。
cin.Ignore()
应该可以解决问题
还有一个非常简单的方法:
#include <iostream>
std::cin.clear() //reset stream state so that cin.fail() becomes false.
std::cin.ignore(INT_MAX,'\n'); //clear the stream from any remaining characters until the \n which is present at the end of any cin.
这将重置流状态并清除其中的所有剩余内容。更简单,代码更少,头文件也更少。