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
相关产品推荐
相关产品推荐

