c++ cin.getline()的问题

#include<cstdlib>#include<iostream>usingnamespacestd;voidadd_air_information(){chara[... #include <cstdlib>
#include <iostream>

using namespace std;
void add_air_information()
{
char a[100];//定义变量来存储每次输入的信息。
int b; //定义变量储存每次输入的信息。

cout << "A" << endl;
cout << "B" << endl;
cin.getline(a,99);
cout << "C" << endl;
cin.getline(a,99);

}
int main(int argc, char** argv) {
char a;
cin >> a;// 同学说,有可能是这里 输入一个 字符,但是输入的 回车
//没有被读掉,当下一次输入的时候就出问题了。。。可是为什么呢????
switch (a)
{
case '1': add_air_information();
break;
}
return 0;
}

输出结果是
A
B
C
直接跳过了中间的一个 cin.getline();!!!!
试验之后 ,在第一个cin.getline();
之前加 getchar();就可以避免这种情况,而换成cin.clear() 就不行了
具体是什么问题呢,还有所提到的三个函数用法是什么呢,求指教啊。
展开
 我来答
davy21cn
推荐于2018-04-12 · TA获得超过152个赞
知道答主
回答量:60
采纳率:0%
帮助的人:98.5万
展开全部
cin.clear()不是用来清空流的。。。是用来清空之前出现的错误flag的
简单的解决方法是在cin>>a;之后加上cin.ignore()来吃掉那个回车。
你出现这个问题的原因在于同时使用了两种stream的处理方法——formatted和unformatted。cin>>a是formatted的方法,相当于给你提供了一些方便。但是糅合上使用unformatted的cin.getline()就会出错了。注意用cin的时候只使用一种类型的函数就不会出错了
追问
cin.ignore(), 这个函数是用来清空缓冲区的~~清除所有输入记录,还是只清掉一个字符?
追答
可以带一个整型参数,不带的话,默认是吃掉一个
匿名用户
2011-12-07
展开全部
你同学说得是对的,使用getchar()就吸收掉了上一次用户输入最后敲入得回车,其实使用:fflush(stdin);也是一样的效果。
但是使用cin.clear();是不对的,cin.clear()作用不是清空键盘缓冲区,而是清楚先前使用cin所设定的一些cin状态(例如设置输出宽度,格式等等),清除缓冲区应该使用cin.ignore()。

cin.ignore()的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:
cin.ignore( 1024, '\n' );
通常把第一个参数设置得足够大,这样实际上总是只有第二个参数 '\n' 起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去,明白了吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jaybestwang
2011-12-07 · TA获得超过4106个赞
知道小有建树答主
回答量:940
采纳率:0%
帮助的人:710万
展开全部
clear是用来清除错误状态的,你的输入没有错误当然无效了,的确cin之后输入流里会留下一个换行符,所以第二次getline的时候直接读入了这个换行符,但是getline本身读取输入后会丢弃换行符,所以第二个getline可以正常读取
追问
cout 可以清楚之前的输入缓冲么?
追答
。。cout是输出啊,跟输入不是一个流,怎么能清除呢。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式