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() 也有清除缓冲区的功能

猜你喜欢

转载自blog.csdn.net/M_jianjianjiao/article/details/86419062
cin