c语言里关于switch的问题
这个问题要从getchar()
这个函数入手,getchar
由宏实现:#define getchar() fgetc(stdin)
。getchar
有一个int
型的返回值.当程序调用getchar
时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).
就是说你输入T+Enter的时候,第一个,也就是while
循环里的getchar()
读到了T,进入if
中的getchar
,而你输入的Enter
保存在缓冲区中,直接就被这个getchar
读取了,所以判断结果永远是非,当然不可能打印Tuesday
,不明白的话你在提示“请输入首字母”的时候随便输一个符合default
的值,会打印两个请重新输入,输入两个,则会打印三个,这就说明你一次输入多个,下次调用getchar
的时候会直接读缓冲区里存储的数据,知道读完才会让你再次输入。
解决方法如下:
#include<stdio.h>
#include <stdbool.h>
#include<ctype.h>
int main() {
char letter,i;
scanf(" %c", &letter);
//letter = toupper(letter);//将字母转化为对应的大写字母 ctype.h
//fflush(stdin);//可以在这儿加一个强制键盘缓冲区清空处理,用以清空输入最后所带的回车
switch (letter)
{
case 'M':printf("星期一\n"); break;
case 'W':printf("星期三\n"); break;
case 'F':printf("星期五\n"); break;
case 'T':printf("输入第二个字母:(u/h)\n");
//if ((letter = getchar()) == 'u') printf("星期二\n");
scanf(" %c", &i);
if (i == 'h') printf("星期四\n");
else if (i =='u') printf("星期二\n");
else printf("数据错误\n");
break;
case 'S':printf("输入第二个字母:(a/u)\n");
scanf(" %c", &i);
if (i == 'a')
printf("星期六\n");
else if (i == 'u')
printf("星期天\n");
else
printf("数据错误\n");
break;
default:printf("数据错误\n");
}
//fflush(stdin);//这儿加一个强制键盘缓冲区清空处理,用以清空case语句里输入时最后所带的回车
return 0;
}