项目场景:
输入星期几的第一个字母来判断是星期几,如果第一个字母一样,则继续判断第二个
这是人民邮电出版社王曙燕编写的《C语言程序设计教程》中第四章《选择程序分支结构程序设计》中的一道例题,P72-74。
问题描述
源代码如下:
开发环境:win10操作系统+VC6.0
在输入大写字母S或T后,再输入第二个字母a/u或者u/h时,运行结果是“数据有错!”,得不到正确的结果。
原因分析:
scanf和getchar都从输入缓冲区中获取输入,用回车来结束。但是结束时,回车依然留在缓冲区中,会被下一次获取输入的getchar获取,从而造成错误。
解决方案:
在第一次scanf执行后,加一个getchar(),将缓冲区里的回车跳过。
在第二次获取输入时,只使用一次letter=getchar();后面的判断用letter做判断。
代码如下:
#include <stdio.h>
main()
{ char letter;
printf(“请输入某一天的第一个字母:(S/F/M/T/W)\n”);
scanf(“%c”,&letter);
getchar();
switch (letter)
{
case ‘S’: printf(“请输入第二个字母:(a/u)\n”);
{
letter=getchar();
if(letter==‘a’)
printf("星期六(Saturday)\n");
else if (letter=='u')
printf("星期天(Sunday)\n");
else printf("数据有错!\n");
}
break;
case 'F':printf("星期五(Friday)\n");break;
case 'M':printf("星期一(Monday)\n");break;
case 'T':printf("请输入第二个字母:(u/h)\n");
{
letter=getchar();
if(letter=='u')
printf("星期二(Tuesday)\n");
else if(letter=='h')
printf("星期四(Thursday)\n");
else printf("数据有错!\n");
}
break;
case 'W':printf("星期三(Wednesday)\n");break;
default: printf("数据有错!\n");
}
}
初学者尽量避免滥用getchar(),以免造成错误。