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; }
结果图作为参考: