#include <stdio.h>
int func(char direction){
int flag = 1;
switch(direction){
case 'q':
printf("向前走\n");
break;
case 'h':
printf("向后走\n");
break;
case 'z':
printf("向左转\n");
break;
case 'y':
printf("向右转\n");
break;
default:
puts("指令错误,请重新输入:");
flag = 0;
}
return flag;
}
int main(){
char direction;
int flag;
printf("请输入方向指令q/h/z/y:\n");
do{
scanf("%c", &direction);
flag = func(direction);
}while(!flag);
return 0;
}
代码输出结果如下:
while循环条件满足时,连续输出了两句话,看似func函数连续执行了两次,而直接跳过了scanf的执行,其实不然,当输入回车时,scanf会读取缓冲区的输入值,即字符'c'和回车字符,实际上scanf也被执行了两次,只不过第二次读取的是回车字符
解决办法:
1.可以用getchar()来吸收输入的回车字符
2.利用fflush(stdin)清除缓冲区的数据
do{
scanf("%c", &direction);
getchar();
//fflush(stdin)
flag = func(direction);
}while(!flag);