为了账号安全,请及时绑定邮箱和手机立即绑定

如图,请教一下关于C++中缓冲区提取数据问题,涉及到cin.ignore()函数!求

如图,请教一下关于C++中缓冲区提取数据问题,涉及到cin.ignore()函数!求

萧十郎 2021-12-10 11:07:40
#include "iostream"#include "string"using namespace std;void main(){int a,b,c;string name;cout<<"a:";cin>>a;cout<<"b:";cin>>b;cin.ignore(1000,'\n');cout<<"name:";getline(cin,name);cout<<"c:";cin>>c;cout<<"a:"<<a<<endl;cout<<"b:"<<b<<endl;cout<<"name:"<<name<<endl;cout<<"c:"<<c<<endl;}运行发现每次输入name后不是直接让我输入c,而是处于阻塞等待我输入,此时输入回车才会跳出c:让我输入,我搞不懂为什么不是直接跳出c:让我输入???
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

所谓“阻塞等待”的原因不是因为cin.ignore(1000,'\n');,而是因为getline(cin,name);。getline(cin,name);这么写是getline(cin,name,'\n');默认简写,它必须等待接收到一个'\n'才向下走,否则继续等待;所以要在最后输入2个'\n'才能继续,就是说第一个'\n'是作为name的结束标记接收但不计入最后一个字符,第二个'\n'才是让getline从输入缓冲区读取字符的命令。你可以把getline(cin,name);改成getline(cin,name,' ');,当你输入完字符串最后一个字符后接着加一个' '再回车,立马就会出现c:让你输入c的值。这样就可以体会为什么写成getline(cin,name);,也就是getline(cin,name,'\n');会要输入两个'\n'才出现提示c:。另说一句,若不用cin.ignore(1000,'\n');,由于前面的cin >> b;会把打入的'\n'遗留在输入缓冲区,getline会把它当作字符串输入结束标记而使逻辑混乱。所以当getline(cin,name);这么写时,cin.ignore(1000,'\n');就有必要了;若写成getline(cin,name,' ');,不要cin.ignore(1000,'\n');也会正常工作(前面遗留了' '时除外,一般不会遗留' ')。

查看完整回答
反对 回复 2021-12-13
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。你不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束,就是这样啊,所以你每次都少一个字符.

查看完整回答
反对 回复 2021-12-13
  • 2 回答
  • 0 关注
  • 222 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信