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

如何在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;
}

关键修复点说明

  1. 初始化指针数组元素:通过malloc为每一行字符串分配独立内存,确保data[line]指向有效可写空间,解决未初始化内存问题。
  2. 修正循环逻辑:直接用fgets返回值判断是否读取到内容,同时限制行数避免数组越界。
  3. 处理换行符:用strcspn快速定位并替换换行符,保证字符串格式整洁。
  4. 使用实际行数:排序和打印时用实际读取的line值,而非数组总容量,避免处理空指针。
  5. 内存泄漏防护:分配内存失败时及时释放已分配空间,程序结束前释放所有动态内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:45:40