关于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的缓冲区不是绑定在一起的吗?
请高手救救我,多谢。 展开
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的缓冲区不是绑定在一起的吗?
请高手救救我,多谢。 展开
若以下回答无法解决问题,邀请你更新回答
1个回答
展开全部
cin是包含一个错误检查的。如果cin中缓存区的数据是不正确的,它要求程序必须对其进行处理。否则后续的输入都会是有问题的。cin通过标志位的方式来进行标注。我们需要调用clear来清除这个标志位。
ignore是用来清空当前的缓存区的。默认是清除到EOF为止。
如果不ignore,那么cin里面的错误的数据还在。那么读取还是不正常的。
cin和cout的缓冲区是不一样的。程序常用的数据流有stdin,stdout,stderr。
ignore是用来清空当前的缓存区的。默认是清除到EOF为止。
如果不ignore,那么cin里面的错误的数据还在。那么读取还是不正常的。
cin和cout的缓冲区是不一样的。程序常用的数据流有stdin,stdout,stderr。
追问
多谢解答,看来我理解错缓冲区绑定的意思了。
但是
尝试在后面添
char tmp;
cin<<tmp;
还是不行,说明cin在第一次读取失败后,把错误的输入丢弃了。但好像又没丢全。请问这个时候缓冲区中还剩了什么?考虑win下回车是/r/n,有没有可能是/n,有办法验证么?
追答
cin>>tmp, cout<<xxx。运算符写反了。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询