解决C语言菜单程序中while(1)循环无指令重复执行的问题
解决C语言菜单循环中额外触发"INVALID INPUT"的问题
这个问题我之前也踩过坑,核心原因是输入缓冲区里残留的换行符被后续的scanf误读取了,让我给你拆解清楚:
当你输入p然后按回车时,输入缓冲区里实际存的是'p'加上一个换行符'\n'。第一次scanf("%c", &uc)读取了'p',但换行符还留在缓冲区里。等下一次循环执行scanf("%c", &uc)时,它直接读取了这个换行符——而换行符不是你定义的p/f/a/d/e中的任何一个,所以就触发了INVALID INPUT的提示。
最简单的一劳永逸修复方案
在读取字符的scanf格式字符串前面加一个空格,修改成这样:
scanf(" %c", &uc);
这里的空格会告诉scanf自动跳过所有空白字符(包括换行符、空格、制表符等),直到遇到第一个非空白字符才会读取,完美解决了残留换行符的问题。
另一种可选方案(适合理解缓冲区机制)
如果想手动清理缓冲区的换行符,可以在每个功能分支里的scanf("%d", &n)后面加上getchar(),吃掉残留的换行符:
scanf("%d", &n); getchar(); // 吃掉输入数字后按下的回车换行符
不过这种方法需要在每个读取数字的地方都添加代码,不如第一种方案高效。
额外的小优化建议
你的prime函数在处理0或1时会有未定义行为(循环不执行,函数没有明确返回值),可以给函数补全边界判断:
int prime(int a) { if (a <= 1) return 0; // 0和1都不是质数 int i; for (i = 2; i < a; i++) { if (a % i == 0) { return 0; } } return 1; // 循环结束说明无因数,是质数 }
这样函数逻辑会更严谨。
内容的提问来源于stack exchange,提问作者Nobita Nobi Jr
相关产品推荐
相关产品推荐

