由一个switch语句理解c语言中getchar函数

时间:2022-09-08 16:30:08

首先说明我们用switch语句实现的功能为:

统计输入的a(A),b(B)字母的个数。

代码如下:

#include<stdio.h>
int main(void)
{
int grade;
int acount=0;
int bcount=0;
while((grade=getchar())!=EOF)
{

switch(grade)
{
case 'a':
case 'A':
++acount;
break;
case 'b':
case 'B':
++bcount;
break;
}
}
printf("A为%d\n",acount);
printf("B为%d",bcount);
}

运行结果为:

由一个switch语句理解c语言中getchar函数

由一个switch语句理解c语言中getchar函数由一个switch语句理解c语言中getchar函数

这样一看代码似乎没有什么问题。但是当我们把default加上我们便会发现问题。下面我们加上

default :
printf("错了!\n");

再输入同样的数据,运行结果为:

由一个switch语句理解c语言中getchar函数

由一个switch语句理解c语言中getchar函数由一个switch语句理解c语言中getchar函数

这让我很是疑惑。通过查询才慢慢的理解为什么会出现这样的情况。

我们调用getchar函数时,程序等着我们用键盘输入。而我们输入的字符先是被存放在缓冲区里,等到我们输入完了,按下回车键(此时换行符\n也会进入缓冲区),getchar才开始从缓冲区里取字符,且一次只能取一个如果用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。

下面我们举例子说明:我们利用加入default后的代码。

我们连着按5下a,再按回车,出现了一个“错误”。这是因为缓冲区里存下了“aaaaa\t”。getchar先取第一个“a”,进入循环;接着往下取“a”,进入循环。最后取到换行符“\t”,进入循环,由于没有对应的字符,执行default中的指令,打印“错了!”。

由一个switch语句理解c语言中getchar函数

由一个switch语句理解c语言中getchar函数

我们输入别的东西试试。我们直接按回车,缓冲区里存下换行符“\t”,getchar取到换行符,输出“错了!”。

由一个switch语句理解c语言中getchar函数

由一个switch语句理解c语言中getchar函数

再输入“ddd”按下回车,

由一个switch语句理解c语言中getchar函数由一个switch语句理解c语言中getchar函数


所以我们需要在switch语句中加入:

case '\n':
case '\t':

case ' ' :

break;

以排除 换行,制表和空格的影响。运行可得:

由一个switch语句理解c语言中getchar函数

由一个switch语句理解c语言中getchar函数