cin.clear()与cin.sync()的使用

cin.clear()与cin.sync()使用是有先后顺序的。

他们的作用:

  cin.clear(); //将流中的所有状态都重设为有效值

  cin.sync();//清空流

在输入错误的情况下,如果先执行cin.sync() (清空流) ,会发生下面的情况:

在流中fail()结果为1( 状态值无效) 的情况下,执行cin.sync(); 清空流是无效的,输入流中的数据依旧在(从错误开始那个,包括错误那个字符仍然在流中)。

#include <iostream>

using namespace std;

int main()
{
    int a;
    char c;
    cout<<"输入字母:"<<endl;  //输入ab4试试 
    cin>>a;    //由于输入的是字母,会出错
    cout<<"cin.fail() = "<<cin.fail()<<endl; //因为输入出错,会输出1. 
    cout<<"a = "<<a<<endl;  //没有输入成功,因此a是随机值 
    cin.sync();    //在流中fail()状态值无效的情况下,执行cin.sync(); 清空流是无效的 
    cout<<"cin.fail() = "<<cin.fail()<<endl; //流中fail标志位仍然是1. 
    cin>>a;        //还是会读取'a',仍然出错 
    cout<<"cin.fail() = "<<cin.fail()<<endl; //因为输入出错,会输出1. 
    cout<<"a = "<<a<<endl;  //输出和上面相同的随机值。 
    cin.sync();    //在流中fail()状态值为1的情况下,执行cin.sync(); 清空流是无效的
    
    cin.clear();   //将流中的所有状态值都重设为有效值 
    cin>>c;        //由于上面清空流无效,‘ab4’还在输入流中,这是读取'a' 
    cout<<"c = "<<c<<endl;
    cin>>c;       //读取'b' 
    cout<<"c = "<<c<<endl;
    cin>>a;       //读取'4' 
    cout<<"a = "<<a<<endl;
    cout<<"cin.fail() = "<<cin.fail()<<endl; //输入成功,错误标志位为0 
    
    cin.sync();  //这时流中fail()状态值为0,输入流被成功清空 
    cout<<"输入数字
";
    cin>>a;
    cout<<"a = "<<a<<endl;    
    return 0;
}

结果图作为参考:

    

原文地址:https://www.cnblogs.com/qzhc/p/11959245.html