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

C语言从文件读取姓名二维数组做冒泡排序时卡死报错如何解决?

问题原因
  • 数组越界访问:冒泡排序内层循环条件j <= n - i会导致j+1最大取值为n,而你的姓名数组最大下标为n-1,越界访问未初始化内存,触发访问违例,甚至导致程序逻辑异常卡死。
  • 文件读取逻辑错误:feof判断会多读一行空内容,且你固定传入n=100作为排序长度,文件实际存储的姓名数量远小于100,剩余的数组元素都是未初始化的垃圾值,strcmp比较垃圾值会出现不可预期的行为。
  • 文件打开失败后未终止程序:即使文件读取失败,代码仍然会执行排序逻辑,直接比较全是垃圾值的数组,也会触发异常。
  • Visual Studio调试模式下未初始化的栈内存会被填充为0xCCCC前缀的特征值,你遇到的0xC0000005错误就是访问了这部分未初始化的无效内存导致的。
修复后代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void sortStrings(char[100][30], int);

int main()
{
    FILE* fp;
    char name[100][30] = {0}; // 初始化数组避免垃圾值
    int list, n;
    fp = fopen("List.txt", "r");
    if (fp == NULL)
    {
        printf("Cannot open file");
        return 1; // 打开失败直接退出
    }
    
    list = 0;
    // 用fgets返回值判断是否读取成功,避免feof多读的问题
    while (list < 100 && fgets(name[list], 30, fp) != NULL)
    {
        // 去掉fgets读取到的换行符
        name[list][strcspn(name[list], "\n")] = '\0';
        list++;
    }
    fclose(fp);
    n = list; // 用实际读取到的姓名数量作为排序长度
    
    sortStrings(name, n);
    
    printf("Strings in sorted order are : ");
    for (int i = 0; i < n; i++)
        printf("\n String %d is %s", i + 1, name[i]);

    return 0;
}

void sortStrings(char name[100][30], int n)
{
    char temp[30]; // 数组长度和单条姓名长度一致即可
    int i, j;
    // 修正循环边界避免越界
    for (i = 0; i < n; i++)
        for (j = 0; j < n - i - 1; j++)
            if (strcmp(name[j], name[j + 1]) > 0)
            {
                strcpy(temp, name[j]);
                strcpy(name[j], name[j + 1]);
                strcpy(name[j + 1], temp);
            }
}
核心修改说明
  • 调整冒泡排序循环边界,内层循环上限改为n - i - 1,彻底避免j+1越界
  • 改用fgets返回值判断文件读取结束,避免feof多读空行的问题
  • 排序长度使用实际读取到的姓名数量list,不再固定为100
  • 增加数组初始化、文件打开失败退出逻辑,避免操作未初始化内存
  • 新增换行符处理逻辑,去掉fgets读取到的每行末尾的换行符,避免排序异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:48:00