首页 文章

重新获得cin流状态c

提问于
浏览
1

在这里我试图从用户获得一个整数,循环输入是正确的 .

输入非整数值(例如“dsdfgsdg”)后,cin.fail()返回true,如预期的那样,循环体开始执行 .

在这里,我使用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 回答

  • 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

    cin.clear()不清除缓冲区;它会重置错误标志 . 因此,您仍然会在缓冲区中输入sting,并且在清除cin缓冲区之前,代码将不允许您输入新数据 . cin.Ignore() 应该做的伎俩

  • 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');
        }
    }
    

相关问题