cin.clear()与cin.sync()

我们先来谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码:

#include <iostream> 
using namespace std; 

int main() 
{ 
        int a; 
        cin>>a; 
        cout<<cin.rdstate()<<endl; 
        if(cin.rdstate() == ios::goodbit)
{
cout<<"输入数据的类型正确,无错误!"<<endl; 
             } 
        if(cin.rdstate() == ios_base::failbit) 
        { 
                cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl; 
        } 
        system("pause"); 
}

我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate();
当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下:
cin.clear(标识符);
标识符号为:

goodbit 无错误 
Eofbit 已到达文件尾 
failbit 非致命的输入/输出错误,可挽回 
badbit 致命的输入/输出错误,无法挽回 
若在输入输出类里.需要加ios::标识符号 
通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:

#include <iostream> 
using namespace std; 

int main() 
{ 
        int a; 
        while(1) 
        { 
                cin>>a; 
                if(!cin)            //条件可改写为cin.fail() 
                { 
                        cout<<"输入有错!请重新输入"<<endl; 
                        cin.clear(); 
                         cin.sync();   //清空流
                } 
                else 
                { 
                        cout<<a; 
                        break; 
                } 
        } 
        system("pause"); 
}

上面的cin默认参数为0,即无错误,正常操作.当我们输入英文字母'k'时,它的状态标识改为fail(即1),即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.

---------------------------------------------------------------------

自己再添加一句:如果输入错误,则再也输入不进去,须用clear.而sync用于清除当前输入缓冲区中的内容。

#include <iostream>

int main()
{
 using namespace std;
    
 int a; 
 cin >> a;
 cout << a <<endl;
 cin >> a ;
 cout <<a <<endl;
 cin.clear();
 cin.sync();  // 可以将cin.clear();cin.sync();  不同时注释掉试一下就知道了
 cin >> a;
 cout <<a <<endl;

return 0;

}

 cin.sync();    // 这个函数是用来清空缓冲区的 

cin.clear();的错误是清楚错误标志
例如一下程序
#include <iostream>
using namespace std;

int main()
{ int a,b;
  cin>>a;
  cin>>b;

  
 return 0;
}
假如,运行都cin>>a时要求输入,这是输入的是一个字符。
这样,和a的类型不符合,cin的状态就标志为错误,因为cin的状态为错误,以后的cin>>都不会被执行。

可能你有疑问,“是不是在cin>>b前加个cin.clear(),cin>>b就可以执行”。
答案是不是的,因为在第一次输入字符时候cin>>a;因为类型不符合,就不会从输入流中提取数据,也就是说,输入流中,上一次输入的字符仍然存在。
那么我们可以使用cin.sync()来清空输入流。

cin>>a;
 cin.clear();
 cin.sync();
 cin>>b;

总之,cin.clear()一般要和cin.sync()一起用 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值