菜单驱动型switch程序异常求助:选2/3时重复要求输入数字
菜单驱动C程序的重复输入问题排查
我写了一个菜单驱动的C语言程序,功能包括计算阶乘、判断质数、判断奇偶和退出。现在遇到的问题是:输入选项1时阶乘功能正常,但输入选项2或3时,程序会先提示输入数字,输入后又再次要求输入数字,之后才结束流程。我试过更换while循环为for(;;),但问题依旧,搜索后猜测可能和换行符缓冲区有关,但没搞懂具体原因,想请教问题出在哪。
程序代码如下:
#include<stdio.h> #include<stdlib.h> int main() { int choice,num,i,fact; while(1) { printf("\n 1-factorial\n"); printf("\n2-prime\n"); printf("\n3.odd/even\n"); printf("\n4-exit\n"); printf("your choice?\n"); scanf("%d",&choice); switch(choice) { case 1: printf("enter a number"); scanf("%d",&num); fact=1; for(i=1;i<=num;i++) { fact=fact*i;//factorial of a number// } printf("factorial value is %d\n",fact); break;//ends the loop here// case 2: printf("enter a number"); scanf("%d",&num); for(i=2;i<num;i++) { if(num%i==0) { printf("the number is not a prime number\n"); break; } if(i==num) { printf("the number is prime\n"); break; } } case 3: printf("enter a number"); scanf("%d",&num); if(num%2==0) { printf("the number is even\n"); } else { printf("the number is odd\n"); break; } case 4: exit(0);//terminates program execution included in the <stdlib.h>// default: printf("the choice is invalid\a\n");//\a means alarm// } } return 0; }
问题根源分析
这个问题和缓冲区无关,核心是switch语句中缺少必要的break语句:
- 当选择选项2时,执行完case2的代码后没有对应的break,程序会继续向下执行case3的代码,所以会再次提示输入数字,这就是重复要求输入的直接原因。
- case3中仅else分支有break,if分支执行完后会继续跑到case4的
exit(0),虽然会输出奇偶结果后退出,但逻辑存在明显错误。 - 另外case2还有一个逻辑bug:for循环条件是
i<num,所以i永远不可能等于num,导致无法正确判断质数(比如输入2时,循环不会执行,也不会输出质数提示)。
修复后的关键代码片段
switch(choice) { case 1: printf("enter a number"); scanf("%d",&num); fact=1; for(i=1;i<=num;i++) { fact=fact*i; } printf("factorial value is %d\n",fact); break; case 2: printf("enter a number"); scanf("%d",&num); if(num <= 1) { printf("the number is not a prime number\n"); } else { int is_prime = 1; for(i=2;i*i<=num;i++) // 优化循环范围,提升效率 { if(num%i==0) { is_prime = 0; break; } } is_prime ? printf("the number is prime\n") : printf("the number is not a prime number\n"); } break; // 新增break,避免执行后续case case 3: printf("enter a number"); scanf("%d",&num); if(num%2==0) { printf("the number is even\n"); } else { printf("the number is odd\n"); } break; // 将break移到case3末尾,确保执行完直接跳出switch case 4: exit(0); default: printf("the choice is invalid\a\n"); }
内容的提问来源于stack exchange,提问作者akshat.1010
相关产品推荐
相关产品推荐

