关于getchar()的使用
最近用到getchar函数,但发现用的时候输入一个字符后总提升输入有误,通过在网上找了一些资料。
原因为:
以下转自csdn
============================================
http://topic.csdn.net/u/20080630/08/cc6d129b-d28c-4a95-a83d-b8e0001d0b11.html
因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,就好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一点,开一次就放掉一点,直到放光了为止,这里开闸动作就相当于调用一次getchar()。我们输入的字符串也是这么一回事,首先我们输入的字符串是放在内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放例子中循环条件里的'\n'实际上就是你输入字符串后的回车符,所以意思就是说,直到遇到回车符才结束循环,而getchar()函数就是等待输入(或缓冲区中的数据)直到按回车才结束,所以实现了整个字符串的输出。当然,我们也可以把循环条件改一下,比如while ((c=getchar())!='a'),什么意思呢,意思就是遇到字符'a'就停止循环,当然意思是如果你输入“12345a213123\n”那么只会输出到a,结果是12345a。
再次注意:用getchar()它是从“流”中间去读取,所以第一个getchar()接受的是刚刚中断的流队列中即将出列的第一个字符(不限于回车符,上面举过例子了),如果流队列不为空,执行getchar()就继续放水,直到把回车符也放空为止,空了之后再在执行getchar()就停下等待你的输入了;我们用getch()为什么每次都是等待用户的输入呢?因为getch()是从键盘接收,即时的接收,并不是从stdin流中去读取数据。
补充:按键盘上的回车产生了2个字符:回车符('\r')和换行符('\n')。回车符'\r'(CR:carriage return:倒车)使光标回到这行的首部,换行符('\n')(new line)然后再换行。
所以当输入字符'w',并按下回车键以后。首先得到回车符。那个getchar函数结束了。 但是还存在一个换行符。所以如果用getchar()来做判断的时候。最好再写一次getchar()清除缓冲区的'\n'掉,直到不满足循环条件退出为止。
===============================================
以下为自己写的测试程序
#include<stdio.h>
#include<stdlib.h>
int PrintTest()
{ char c = 0;
int flag = 0;
while(1)
{
/*begin:加入这个判断可正确字符,不再提示输入有误*/
if('\n' == (c = getchar()))
{
printf("Please input a 'Y'or 'N'");
continue;
};
/*end*/
switch(c)
{
case 'Y':
case 'y':
flag = 1;
break;
case 'N':
case 'n':
return 1;
default:
printf("you input a wrong letter!Please input again!");
continue;
}
if(flag == 1)
break;
}
return 0;
}
void main()
{
int i = 1;
while(i<=100)
{
if(0 == i%10)
if(1==PrintTest())
{
return;
}
printf("The number i = %d\n",i);
i++;
}
return;
}