cin、cin.clear()、cin.ignore()与输入缓冲区

来源:互联网 发布:网站中文域名注册 编辑:程序博客网 时间:2024/06/06 11:01

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(),我看有很多人认为他的作用是清楚缓冲区,但是我试了试,使用它,并没有清除,错误输入仍然会残留在缓冲区,跪求知道的大佬告诉我~…

原创粉丝点击