【问题标题】:Resetting cin stream state C++重置cin流状态C++
【发布时间】:2013-12-11 20:39:29
【问题描述】:

我在这里尝试从用户那里获取一个整数,在输入正确时循环。

输入非整数值(例如“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.ignore(...)清除输入流

标签: c++ validation input stl


【解决方案1】:

cin.clear() 不清除缓冲区;它重置错误标志。因此,您的缓冲区中仍会保留您输入的字符串,并且在您清除 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');
        }
    }
    

    【讨论】:

      【解决方案3】:

      在cin.clear() 之后,你这样做:

      #include <iostream> //std::streamsize, std::cin
      #include <limits> //std::numeric_limits
      ....
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
      

      上面的作用是清除输入流中仍然存在的任何字符。否则 cin 将继续尝试读取相同的字符并失败

      【讨论】:

        猜你喜欢
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2012-04-18
        • 2017-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多