C语言作业程序输入菜单字符后立即退出问题排查求助
问题修复与优化建议
直接导致程序输入选项后终止的核心问题
你在使用scanf("%d", &num)接收完最后一个数字(0或负数)后,用户按下的回车换行符会残留在输入缓冲区中。后续执行scanf("%c", &sort)时会直接读取到这个换行符,而非你输入的A/B/C/D字符,导致Sort函数中所有判断分支都无法命中,程序直接结束。
修复方法:将读取选项的代码修改为scanf(" %c", &sort),格式符前加空格可以自动跳过所有空白字符(包括换行、空格、制表符),直接读取有效输入字符。
其他逻辑错误
- 素数判断逻辑错误
- 数字1不是素数,但你的
isPrime函数传入1时会直接返回1(循环i=2;i<1不执行,flag保持为1) - 循环上限可以优化到
sqrt(num),无需遍历到num-1,大幅提升大数字的判断效率
修正后的isPrime函数示例:
int isPrime(int num) { if(num <= 1) return 0; if(num == 2) return 1; if(num % 2 == 0) return 0; for(int i=3; i*i <= num; i+=2) { if(num%i == 0) return 0; } return 1; } - 数字1不是素数,但你的
- 无用变量冗余
你定义了int arr[1000]但全程没有使用,可以直接删除。 - 选项仅支持大写
现有逻辑仅能识别大写A/B/C/D,建议增加小写判断,提升可用性:例如将sort == 'A'修改为sort == 'A' || sort == 'a'。
优化建议
- 函数命名优化
你的Sort函数功能是按位数截取输出,和排序完全无关,建议重命名为displayByDigit之类语义明确的名称。 - 重复代码简化
四个选项的处理逻辑高度相似,可以统一用模值和阈值变量简化,无需重复写四个循环:void displayByDigit(char op, int psize, int* prime) { int mod, threshold; char* title; switch(op) { case 'A': case 'a': mod=10; threshold=0; title="Ones"; break; case 'B': case 'b': mod=100; threshold=10; title="Tens"; break; case 'C': case 'c': mod=1000; threshold=100; title="Hundreds"; break; case 'D': case 'd': mod=10000; threshold=1000; title="Thousands"; break; default: printf("Invalid option!\n"); return; } printf("%s\n", title); for(int i=0; i<psize; i++) { int ans = prime[i] >= threshold ? prime[i] % mod : 0; printf("%d = %d\n", prime[i], ans); } } - 菜单显示优化
打印菜单时末尾加换行,提示更清晰,避免输入字符和菜单文字挤在一起。
内容的提问来源于stack exchange,提问作者Kristofer
相关产品推荐
相关产品推荐

