C++将输入看作是流入程序的字符流,iostream文件定义cin为表示这种流的对象
对应的输入数据都会先存入输入缓冲区,cin从输入缓冲区中读入数据,所以当缓冲区中有残留数据时,cin直接取得残留数据而不会请求键盘输入
cin是以空格为分隔的,而读到回车后,结束输入,丢掉换行,即回车在正常情况下不进入缓冲区
那么,在非法输入后,我们会面对什么呢?
#include<iostream>
using namespace std;
int main()
{
int a,b;
cin >> a;
//cout << " cin.fail == " << cin.fail() << endl;
//cin.clear();
//cin.ignore();
cin >> b;
cout << "a == " << a << " b == " << b;
return 0;
}
这段代码在等待一个整形的输入,如果你输入的是一个字符,那么,就会cin,fail会置为1,并打断接下来的输入,而那个字符和回车会停留在缓冲区,而cin在读入失败时会返回0,也就是说,这段代码,当你输入a 1后,输出为a == 0 b == 0
这个时候就用到了cin.clear(),cin.ignroe(),很多人以为cin.clear()顾名思义就是清空缓冲区,其实它是将cin.fail复位为0,也就是说恢复到继续可以输入的状态,而cin.ignore()会丢掉缓冲区中的一个错误输入字符
记得这两个要一起用,不然当你回复输入后,那个字符还在缓冲区中,下一个b的输入就又错了
cin.ignore()参数为cin.ignore( int num,char ch),意思是丢掉缓冲区中数据达到num个或遇到ch时停止,不给参数默认为cin.ignore(1,EOF),即取出并丢掉错误输出前的一个字符
我们的一般用法要么不给参数,要么给很大一个num,ch给’\n’,也就是说,丢掉一行,像是缓冲区里残留的是字符串时,用这个就比较方便
再看这段代码
#include<iostream>
using namespace std;
int main()
{
int a;
cin >> a;
cin.get();
cin.get();
cout << "读取了回车\n";
return 0;
}
当你输入一个字符后,它输出了那句话,也就是说,当你发生错误输入后,那个字符和回车都留在了缓冲区,而正常情况下回车并不会进缓冲区
还有一个函数是cin.sync(),我看有很多人认为他的作用是清楚缓冲区,但是我试了试,使用它,并没有清除,错误输入仍然会残留在缓冲区,跪求知道的大佬告诉我~…