cin输入的类型不匹配造成的死循环 cin.clear() cin.ignore()函数

当使用cin输入时,如果想要输入的类型为int的,输入时输入成了字符,就会导致cin错误

#include <iostream>
 #include <set>
 
 using namespace std;
 
 int main()
 {
     int a;
     cin>>a;
     while(cin.fail()){
         cin.clear();
         cout<<"输入错误!"<<endl;
         cin.ignore(1024,'\n');
         cin>>a;
     }
     cout<<a<<endl;
 
     ;
 }
 
  • cin.restate() 当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作
  • cin.fail() 可以判断流操作是否失败,输入错误后,cin.fail()返回为真 错误流标志位被置failbit为true, 当恢复时 failbit被设置为false
  • cin.clear() (默认为0 ,即无错误)清除错误的标志位
    clear有多种状态
    • goodbit 无错误
    • Eofbit 已到达文件尾
    • failbit 非致命的输入/输出错误,可挽回
    • badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号
    • 通过设置cin.clear() 或 cin.clear(istream::goodbit)清除错误状态
  • cin.ignore() 清除缓冲区

如果输入错误,通过cin.clear()清除了错误状态标志后,下一次cin输入时,仍会从缓冲区中读取数据,而之前的错误输入此时仍存在缓冲区中,所以还会再次被读取造成错误,所以要清空缓冲区

  • cin.ignore(要清除的字节长度,标识)

cin.ignore(1024,’\n’)
该函数就是将选中的字节取出抛弃掉(cin操作时是以char为单位的)
标识清除的最大长度是1024个字节。
清除时如果遇到‘\n’就停止,不管是否是1024个字节。
如果没有遇到‘\n’就只清除1024个
cin.ignore()的默认参数为cin.ignore(1,EOF),及清除文件描述符前一个字节

  • cin.sync() 也有清除缓冲区的功能
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值