假设有如下代码 int main() {char password[20] = { 0 };scanf("%s", password);printf("你的密码将设置为%s,请确认\n", password);int i = 0;i = getchar();switch (i) {case 1:printf("已确认\n");break;case 0:printf("已删除\n
假设有如下代码
int main() {
char password[20] = { 0 };
scanf("%s", password);
printf("你的密码将设置为%s,请确认\n", password);
int i = 0;
i = getchar();
switch (i) {
case 1:
printf("已确认\n");
break;
case 0:
printf("已删除\n");
break;
default:
printf("请输入1或0\n");
break;
}
return 0;
}
一、bug
当我们运行代码在scanf处输入123后,代码直接执行完毕,并没有等我们在getchar处输入,而是直接执行了switch里
的default。
二、产生原因
在scanf处我们敲下了123和一个回车键,它们以“123\n”储存在输入缓冲区,scanf读走了123,缓冲区还剩一个\n,被getchar直接读取(\n的ASCLL码值为10,非0或1,所以会执行default)
三、解决方法
在scanf和getchar之间加一行代码
while ((getchar()) != '\n') {
;
}
一直执行getchar直至把输入缓冲区的内容取完
为什么不能只用一次getchar把\n取走就好,而要用while语句一直取,直到把\n取走?
因为有一些情况:当密码输入123 456时,scanf只读取123,后面的“空格”+“456”+“\n”一次取不完,需要用while+getchar取干净。