cin没有反应?cin、cin.clear()、cin.ignore()与输入缓冲区

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值