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

如何修改C语言程序,使其遇到非数字符号时不崩溃?

解决C语言程序遇非数字字符崩溃的问题

原代码核心问题分析

  • 文件名硬编码:忽略了传入的file_name参数,始终打开固定的1.txt,和调用时传入的numbers.txt不符
  • while循环逻辑完全错误:fscanf的返回值是成功读取的变量个数(读取整数成功时返回1),原代码用返回值和isdigit(num)比较完全逻辑混乱;且读取失败时num的值未定义,直接使用会引发崩溃
  • 未处理非数字字符:当fscanf无法读取整数时,输入指针不会前进,会无限循环尝试读取同一个非数字字符
  • 无边界情况处理:如果文件中没有有效数字,min保持初始的2147483647,输出结果无意义

修改后的代码

#include <stdio.h>
#include <ctype.h>
#include <limits.h>

void task(const char *file_name)
{
    FILE *file = fopen(file_name, "r");
    
    if (file == NULL) {
        printf("Error opening file.\n");
        return;
    }
    
    int num;
    int min = INT_MAX;
    int min_count = 0;
    int read_result;
    
    while (1) {
        read_result = fscanf(file, "%d", &num);
        if (read_result == 1) {
            // 成功读取整数,更新最小值和计数
            if (num < min) {
                min = num;
                min_count = 1;
            } else if (num == min) {
                min_count += 1;
            }
        } else if (read_result == EOF) {
            // 到达文件末尾,退出循环
            break;
        } else {
            // 读取失败,跳过非数字字符(保留负号以支持负数)
            int c;
            while ((c = fgetc(file)) != EOF && !isdigit(c) && c != '-') {
                continue;
            }
            // 将有效字符放回输入流,供下一次读取
            if (c != EOF) {
                ungetc(c, file);
            }
        }
    }
    
    // 处理无有效数字的情况
    if (min_count == 0) {
        printf("No valid numbers found in the file.\n");
    } else {
        printf("Minimum: %d exists %d time(s)\n", min, min_count);
    }
    
    fclose(file);
}

int main()
{
    task("numbers.txt");
    return 0;
}

关键修改说明

  • 修复文件名硬编码:使用传入的file_name参数打开文件,确保目标文件正确
  • 修正循环判断逻辑:根据fscanf的返回值分情况处理:
    • 返回1:成功读取整数,执行最小值统计逻辑
    • 返回EOF:文件读取完毕,退出循环
    • 返回0:读取到非数字,进入跳过逻辑
  • 添加非数字跳过逻辑:用fgetc逐个读取并跳过非数字字符,遇到负号或数字时用ungetc放回输入流,保证后续能正确解析整数
  • 规范初始值:用<limits.h>定义的INT_MAX替代魔法数字,提升代码可移植性
  • 边界情况处理:当文件中没有有效数字时,输出明确提示,避免无意义结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:43:14