C++ 重置cin流状态C++;

C++ 重置cin流状态C++;,c++,validation,input,stl,C++,Validation,Input,Stl,这里我试图从用户那里得到一个整数,在输入正确时循环 在输入非整数值(例如“dsdfgsdg”)后,cin.fail()将按预期返回true,而循环体将开始执行 这里我使用cin.clear()重置cin的错误标志;与预期一样,cin.fail()返回false 但下一次对cin的调用不起作用,并将错误标志重新设置为打开 有什么想法吗 #include<iostream> using namespace std; int main() { int a; cin >>

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

在输入非整数值(例如“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;
  }
} 
#包括
使用名称空间std;
int main(){
INTA;
cin>>a;
while(cin.fail()){
cout>a;
}
} 
cin.clear()之后执行以下操作:

#include <iostream> //std::streamsize, std::cin
#include <limits> //std::numeric_limits
....
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
#包括//std::streamsize,std::cin
#包括//标准::数值限制
....
std::cin.ignore(std::numeric_limits::max(),“\n”)

上面所做的是清除输入流中仍然留在那里的任何字符。否则,cin将继续尝试读取相同的字符,并且由于样式问题而失败,首选此方法:

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');
    }
}
intmain()
{
INTA;
而(!(std::cin>>a))
{

std::coutcin.clear()不会清除缓冲区;它会重置错误标志。因此,在清除cin缓冲区之前,您仍然会在缓冲区中输入sting,并且代码将不允许您输入新数据。
cin.Ignore()
应该可以做到这一点。

您必须使用
cin.Ignore(…)