重置cin流状态c ++

时间:2013-11-26 15:42:12

标签: c++ validation input stl

这里我试图从用户那里得到一个整数,在输入正确时循环。

输入非整数值(例如“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;
  }
} 

3 个答案:

答案 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()应该做的伎俩