C语言循环输出菜单的程序,为什么scanf后的%前面要加个空格?

编写一个如下菜单程序,要求用户从键盘输入菜单编号,若输入的是“q”,则结束程序运行,否则输出菜单编号,可反复输入菜单编号而不退出程序。

#include<stdio.h>
int main()
{char x;
do
{printf("1---菜单功能1\n2---菜单功能2\n3---菜单功能3\nq---退出\n");
printf("请输入:");
scanf(" %c",&x);
switch (x)
{case '1':printf("1---菜单功能1\n\n");break;
case '2':printf("2---菜单功能2\n\n");break;
case '3':printf("3---菜单功能3\n\n");break;
case 'q':break;
default:printf("错误,请重试\n\n");break;
}
}while(x!='q');
return 0;
}

请问为什么scanf(" %c",&x);的%前面要加个空格?是为什么?(不加的话会多输出一遍菜单)

空格的作用是忽略你每次输入的换行符。
比如,当你输入1<换行>时,用%c首先会读取1,执行case '1':,然后又会读取'\n',执行default:。
要丢弃1行中除第1个字符外的其它字符,这样做更好:
scanf("%c",&x);
fflush(stdin);
这样,就允许你输入1行字符,只读取第1个,如:
123as 526 <换行>
只会读入1,执行case '1':。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-03-12
为了吃掉上一次输入进来的回车……
当你输入1的时候其实进去了两个字符,一个是1,还有一个是回车,这样会造成两次循环。
平时我自己的解决办法是,scanf 最后一个格式控制符加上 %*c,这样可能逻辑上会更好。
你可以试试改成 scanf("%c%*c",&x);
相似回答