如何修改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
相关产品推荐
相关产品推荐

