有时候我们在使用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之前,一定注意清空缓冲区,以免带来程序的错误。