getchar()的记忆清除


有时候我们在使用getchar()的时候,会发现,getchar中内容并不是每次都是我们需要使用的东西,有时候获取的东西让我们赶觉到莫名其妙的。现在先举以简单的例子,让大家看的清楚。

	char c=getchar();
//	getchar();
	cout<<"您输入的是:"<<c<<endl;
	char d=getchar();
	cout<<"您输入的是:"<<int(d)<<endl;


 

想必大家会感觉到这时很容易的一个小程序,输入两个数,然后会按ASCII值输出来,但是,你先运行一下,看看程序的结果是什么呢?第二个结果是“10”,而且我们第二次输入什么值,第二个值都是“10”。为什么会这样呢?

大家可以查看一下ASCII表中10对应的是什么符号?对,就是回车,这就是原因。当我们输入第一个字符的时候,是以回车结束的,字符变量c获取了您输入的第一个字符,但是在缓冲区中的,ASCII值为10的回车符还在那儿存在着,所以,当我们第二次使用getchar()的时候,获取的是缓冲区中原来的回车符,所以,第二次输出的结果一直是10

那我们如何获取第二次输入的值呢。这就是注释掉的那句的作用。通过一个getchar(),获取缓冲区中的内容,这样,我们就可以通过变量“d”获取了我们需要的内容了。多添加一个“getchar()”是一个方法,当然我们还可以通过fflush(stdin);这样在使用下一个输入语句的时候,就可以清除缓冲区的内容,而不至于影响下面的程序了。

不但getchar()会出现这种情况,我尝试了一下scanf也是这样,大家可以试一下下面的程序:

	char c,d;
	scanf("%c",&c);
	printf("%c\n",c);
	scanf("%c",&d);
	printf("%d\n",d);


 

同样,用户还没有输入第二个值的时候,就已经自动输出10(回车对应的ASCII值)了,同样,要是想正确使用的话,我们还是得使用“fflush(stdin);”来清空缓存区。当然,在C++中,我们还可以通过cin.sync();来清空缓冲区。

但是,当我用cin进行尝试的时候,可以正常的运行,程序如下所示:

 

	char c,d;
	cin>>c;
	cout<<"c="<<c<<endl;
	cin>>d;
	cout<<"d="<<d<<endl;

 

那这是不是就是说明回车符没有在缓存区呢?我们可以看一下结果是不是和我们想像的一样,用下面的程序实验一下:

 

	char c,d;
	cin>>c;
	cout<<"c="<<c<<endl;
	char ch=getchar();
	cout<<int(ch)<<endl;
	cout<<"开始d的赋值了:"<<endl;
	cin>>d;
	cout<<"d="<<d<<endl;

 

通过结果可以看到,ch获取了我们输入的回车,于是“cout<<int(ch)<<endl;”自动输出了“10”,底下的照常进行。

所以,以后在使用getchar()或者scanf之前,一定注意清空缓冲区,以免带来程序的错误。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值