为什么C语言选择排序的输出结果与输入文件的数值完全不符?
问题根因
- 数组类型不匹配:定义的
char arr[10]是单字节字符数组,无法存储整数数值,后续排序实际比较的是字符的ASCII值,与文件中的数字完全无关 - 数据读取逻辑错误:用
fgets按行读字符串的方式,没有把文件中空格分隔的数字解析为独立整数存入数组,读取完成后数组仅残留最后一次读入的字符串字节内容 - 容量与计数错误:文件内共11个数字,代码固定写死排序长度
n=10,数组仅预留10个元素空间,即使读取正确也会出现漏读/越界 - 异常处理缺失:
fopen返回空指针时未中断程序,会触发空指针访问的未定义行为
修正代码
#include <stdio.h> #define MAX_CAPACITY 11 // 匹配文件内的数字总数 int main() { FILE *outp; int arr[MAX_CAPACITY]; // 整型数组存储数值 int valid_count = 0; outp = fopen("output.txt", "r"); if (outp == NULL) { puts("Issue in opening the input file"); return 1; // 打开失败直接退出,避免后续非法操作 } // 逐个数读取整数,自动跳过空格、换行等分隔符 while (fscanf(outp, "%d", &arr[valid_count]) == 1) { valid_count++; } fclose(outp); // 选择排序逻辑 int i, j, min_pos, temp; for (i = 0; i < valid_count - 1; i++) { min_pos = i; for (j = i + 1; j < valid_count; j++) { if (arr[min_pos] > arr[j]) min_pos = j; } if (min_pos != i) { temp = arr[i]; arr[i] = arr[min_pos]; arr[min_pos] = temp; } } // 输出排序结果 for (i = 0; i < valid_count; i++) { printf("%d\n", arr[i]); } return 0; }
核心改动说明
- 将字符数组替换为整型数组,适配整数存储需求
- 用
fscanf按整数格式读取文件内容,自动处理分隔符,以实际读取到的有效数字数量作为排序长度,替代固定写死的数值 - 文件打开失败时直接返回程序,规避空指针操作风险
内容的提问来源于stack exchange,提问作者stryder9k
相关产品推荐
相关产品推荐

