You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言作业程序输入菜单字符后立即退出问题排查求助

问题修复与优化建议

直接导致程序输入选项后终止的核心问题

你在使用scanf("%d", &num)接收完最后一个数字(0或负数)后,用户按下的回车换行符会残留在输入缓冲区中。后续执行scanf("%c", &sort)时会直接读取到这个换行符,而非你输入的A/B/C/D字符,导致Sort函数中所有判断分支都无法命中,程序直接结束。
修复方法:将读取选项的代码修改为scanf(" %c", &sort),格式符前加空格可以自动跳过所有空白字符(包括换行、空格、制表符),直接读取有效输入字符。

其他逻辑错误

  1. 素数判断逻辑错误
    • 数字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;
    }
    
  2. 无用变量冗余
    你定义了int arr[1000]但全程没有使用,可以直接删除。
  3. 选项仅支持大写
    现有逻辑仅能识别大写A/B/C/D,建议增加小写判断,提升可用性:例如将sort == 'A'修改为sort == 'A' || sort == 'a'。

优化建议

  1. 函数命名优化
    你的Sort函数功能是按位数截取输出,和排序完全无关,建议重命名为displayByDigit之类语义明确的名称。
  2. 重复代码简化
    四个选项的处理逻辑高度相似,可以统一用模值和阈值变量简化,无需重复写四个循环:
    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);
        }
    }
    
  3. 菜单显示优化
    打印菜单时末尾加换行,提示更清晰,避免输入字符和菜单文字挤在一起。

内容的提问来源于stack exchange,提问作者Kristofer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 19:45:04