关于C++中cin.ignore()的问题

新手,写了下面一段语句前方省略inta,b,c;stringname;cout<<"a:";cin>>a;cout<<"b:";cin>>b;cout<<"name:";... 新手,写了下面一段语句

前方省略
int a,b,c;
string name;

cout<<"a: ";
cin>>a;

cout<<"b: ";
cin>>b;

cout<<"name: ";
getline(cin,name);

cout<<"c: ";
cin>>c;
后方省略

我想要得到的结果是
a:___
b:___
name:___
c:___

我试过了如果没有cin.ignore(1000, '\n'),或者把它放在 cin a/cin c后,那么它就不会让我输入name直接让我输入c。
如果放在cin b后,就没问题。
如果放在getline cin name后,它虽然会让我输入name,但是后来的输出表明name值为空。

我对ingnore这个语句还处于完全不怎么明白的状态,能帮我解释下吗
展开
 我来答
匿名用户
2011-10-09
展开全部
这只是我的猜测:读入b时遇到回车截止,之后的getline函数把cin流中b之后的回车读入了,于是将name置零了(这便是你说的ignore放在getline后的情况)。调用ignore后忽略掉了这个回车,于是可以读取。用cin>>name应该可以正常读入,但是不能读入空格。
御含灵9r
推荐于2017-12-16 · TA获得超过4157个赞
知道大有可为答主
回答量:3007
采纳率:0%
帮助的人:2676万
展开全部
实际上你在每次输入数据的时候会输入一个回车 ‘\n'
cin在读入整数时候会忽略空白碰到非数字('\n')时停止
cin在getline时会把'\n'及之前的内容读回来,哪怕是空行也会读入
cin在读入字符时会把缓冲区内当前字符读入(不会忽略空白)
cin.ignore(1000, '\n')的含义是把缓冲区内从当前字符开始知道'\n'之前字符(如果有1000个的话)忽略掉,实际上你这里假设一行不会超过1000个字符,所以含义是忽略一行

如果你想输入a=1,b=2 name="xxxx", c='y'
所以你的输入是
1回车2回车xxxx回车y回车
cin读入a=1 碰到回车停止 此时1后面的回车还在缓冲区里
cin读b=2时忽略2前面的回车但是停止在2后面的回车
此时你如果掉getline 就会读入一个2后面回车前面的也就是空行 因此此时应当调用一个cin.ignore(1000,'\n')把这个\n忽略掉
更多追问追答
追问
我大概懂点了,但是我还是不明白为什么放在getline后面它就会让我输name了,按道理应该不也是直接跳过吗?
追答
读入b变量的后边必须加一个cin.ignore(1000,'\n')
用来去掉那一行的'\n'
不然b后的getline就不用输入就读到一个空行 这个时候输出就变成了
name:c:了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式