cin
在输入字符的格式与对象不匹配的时候,将输入流对象 cin 挂起,即 cin.fail() 返回 FALSE。
注意:未匹配的输入字符将缓存
cin.clear
流标志复位
可以将cin的状态重置,即将其置为true,cin.fail() 返回 TRUE。
但是不匹配的输入流仍存于缓存中
cin.ignore
缓冲区清空
取走刚才流中的字符,即清除缓冲区字符
注意:如果放入 while 循环,一次只清空一个字符
cin.sync()
清空缓冲区
但我的编译器不支持
不同的编译环境下,函数的功能不一样
对于 std::cin 这些标准库「自带」的输入流来说,调用 sync() 是「实现定义」的行为
调用 sync() 以后,可能清空、可能恢复原状、可能什么都不做。
可以查看编译器(标准库实现)的说明文档,查看具体实现。
参考:
cppreference.com
http://www.cplusplus.com/forum/general/63860/
终极做法
cin.ignore(std::numeric_limits::max(),’\n’);
把第一个参数设置得足够大,即第一个参数失效,判断时总是取第二个参数’\n’,最终把回车(包括回车)之前的所有字符从输入缓冲(流)中清除出去,清空已有所有数据流;
这样就不会出现输入多少个错误字符,弹回多少个错误提示信息。
可以吃掉一大段,但理论上依旧不能保证吃掉无穷大的一行。
#include <iostream>
using namespace std;
int main(){
int a, b, c;
cin >> a >> b;
while(cin.fail()){
cin.clear();
// cin.sync();
// cin.ignore();
cin.ignore(std::numeric_limits<int>::max(),'\n');
cout << "cin again" << endl;
cin >> a >> b;
}
c = a + b;
cout << "c=" << c << endl;
// system("pause");
return 0;
}
参考资料
https://www.cnblogs.com/seamusopen/p/8451883.html
https://blog.youkuaiyun.com/zhaoyl03/article/details/8167049