关于c++里的cin,以及缓冲区 20

比如说intinp;while(cin>>inp){cout<<"inp:"<<inp<<endl;}cin<<inp;cout>>inp;如果输入是“数字+回车”,程序... 比如说
int inp;
while(cin>>inp){
cout<<"inp: "<<inp<<endl;
}
cin<<inp;
cout>>inp;
如果输入是“数字+回车”,程序循环输入输出,不会有问题。(即缓冲区里留下的东西不会引发错误)

但其他输入,比如字母,就不会进入循环。在循环后面加上
cin.clear();
第二次的cin调用并不会被执行,必须后面再加上
cin.ignore();
才行。

那么请问,这里的ignore到底忽略了什么?以及cin遇上回车会有怎样的行为?

另一个问题,cin.ignore()替换为cin.sync()没问题,为什么cout.flush()不行,cin和cout的缓冲区不是绑定在一起的吗?

请高手救救我,多谢。
展开
 我来答
若以下回答无法解决问题,邀请你更新回答
GiraKoo
2016-07-18 · 还没有任何签名哦
GiraKoo
采纳数:3949 获赞数:11110

向TA提问 私信TA
展开全部
cin是包含一个错误检查的。如果cin中缓存区的数据是不正确的,它要求程序必须对其进行处理。否则后续的输入都会是有问题的。cin通过标志位的方式来进行标注。我们需要调用clear来清除这个标志位。
ignore是用来清空当前的缓存区的。默认是清除到EOF为止。
如果不ignore,那么cin里面的错误的数据还在。那么读取还是不正常的。
cin和cout的缓冲区是不一样的。程序常用的数据流有stdin,stdout,stderr。
追问
多谢解答,看来我理解错缓冲区绑定的意思了。

但是
尝试在后面添
char tmp;
cin<<tmp;
还是不行,说明cin在第一次读取失败后,把错误的输入丢弃了。但好像又没丢全。请问这个时候缓冲区中还剩了什么?考虑win下回车是/r/n,有没有可能是/n,有办法验证么?
追答
cin>>tmp, cout<<xxx。运算符写反了。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式