如何在C语言中将文本文件内容读取到指针数组中?
问题分析与修复
核心错误原因
你定义的char* data[1000]是一个指针数组,数组里的每个元素都是未初始化的char*,指向随机内存地址。调用fgets(data[line], MAX_LEN, file)时,相当于往未知内存写入数据,直接触发C6001“使用未初始化内存”的错误。
除此之外代码还有两处逻辑问题:
- 循环条件
!eof(file) && ferror(file)逻辑完全错误:ferror(file)为真表示读取出错,正确条件应该是未到文件末尾且无读取错误,更简洁的方式是直接用fgets的返回值作为循环判断依据。 - 计算
size时用sizeof data / sizeof data[0]得到的是数组总容量1000,但实际读取行数是line,用总容量去排序打印会处理大量空指针,导致程序崩溃或异常输出。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 1000 #define MAX_LINES 1000 // 明确数组最大可存储行数 void sort(size_t size, char* data[]) { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { // 增加空指针判断,避免排序时访问无效内存 if (data[j] == NULL || data[j+1] == NULL) continue; if (strlen(data[j]) < strlen(data[j + 1])) { char* temp = data[j]; data[j] = data[j + 1]; data[j + 1] = temp; } } } } void printArray(size_t size, char* data[]) { for (int i = 0; i < size; i++) { if (data[i] != NULL) { printf("%s\n", data[i]); // 换行输出更清晰 } } } int main(void) { char* data[MAX_LINES]; // 指针数组,最多存1000行字符串 FILE* file; file = fopen("C:\\Users\\EXAMPLE\\desktop\\input.txt", "r"); if (file == NULL) { printf("File Error\n"); return 1; } int line = 0; char buffer[MAX_LEN]; // 临时缓冲区存储每行读取的内容 // 用fgets返回值判断读取状态,同时限制行数不超过数组上限 while (fgets(buffer, MAX_LEN, file) != NULL && line < MAX_LINES) { // 去掉fgets读取的换行符(避免输出时多一行空行) buffer[strcspn(buffer, "\n")] = '\0'; // 为当前行分配内存,复制缓冲区内容 data[line] = malloc(strlen(buffer) + 1); if (data[line] == NULL) { printf("Memory Allocation Error\n"); // 分配失败时释放已分配的内存,避免泄漏 for (int i = 0; i < line; i++) { free(data[i]); } fclose(file); return 1; } strcpy(data[line], buffer); line++; } fclose(file); // 使用实际读取的行数作为排序、打印的长度 sort(line, data); printArray(line, data); // 释放所有动态分配的内存 for (int i = 0; i < line; i++) { free(data[i]); } return 0; }
关键修复点说明
- 初始化指针数组元素:通过
malloc为每一行字符串分配独立内存,确保data[line]指向有效可写空间,解决未初始化内存问题。 - 修正循环逻辑:直接用
fgets返回值判断是否读取到内容,同时限制行数避免数组越界。 - 处理换行符:用
strcspn快速定位并替换换行符,保证字符串格式整洁。 - 使用实际行数:排序和打印时用实际读取的
line值,而非数组总容量,避免处理空指针。 - 内存泄漏防护:分配内存失败时及时释放已分配空间,程序结束前释放所有动态内存。
内容的提问来源于stack exchange,提问作者JohnDoe12
相关产品推荐
相关产品推荐

