重置cin流状态C++

问题描述 投票:0回答:4

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

输入非整数值(例如“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;
  }
} 
c++ validation input stl
4个回答
6
投票

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;
将继续读取相同的非整数字符,并且您的程序将继续循环。


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

1
投票

cin.clear() 不会清除缓冲区;它重置错误标志。因此,您仍然会在缓冲区中输入您输入的字符串,并且在清除 cin 缓冲区之前,代码将不允许您输入新数据。

cin.Ignore()
应该可以解决问题


1
投票

还有一个非常简单的方法:

#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.

这将重置流状态并清除其中的所有剩余内容。更简单,代码更少,头文件也更少。

© www.soinside.com 2019 - 2024. All rights reserved.