You need to enable JavaScript to run this app. 为什么C语言选择排序的输出结果与输入文件的数值完全不符?
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 11:36:04