首页 > 解决方案 > 在使用 fgets 迭代文件时附加到数组

问题描述

C新手在这里。fgets我正在尝试通过在循环中使用循环将文件内容逐行附加到数组中while

但是,当尝试访问数组时,我在访问数组时遇到分段错误 valuearray[1]array[2]. 阅读array[3]时它确实有效。难道我做错了什么?

有人能指出我正确的方向吗?我将在下面留下我的代码。

#include "library.h"
#include <stdio.h>

int main(int argc, char **argv) {
    FILE *file = fopen("words.txt", "r");
    char line[100];
    char *array[] = {};
    int i = 0;
    
    while(fgets(line, sizeof(line), file) != NULL) {
        i++;
        array[i] = line;
    }
    printf("Line %d = %s\n", i , array[1]); //segmentation fault on array[1] and array[2] not on array[3]
}

标签: cfgets

解决方案


您的代码有两个错误。

  1. 没有记忆array

  2. 您继续存储lineinto的地址array。您需要的是将 的内容line放入数组中。

试试看:

#define MAX_LEN 100

char line[MAX_LEN];
size_t capacity = 256;
char (*array)[MAX_LEN] = malloc(capacity * sizeof *array);
if (array == NULL)
{
    // Error
    // Add error handling or just:
    exit(1);
}
size_t i = 0;

while(fgets(line, sizeof(line), file) != NULL) 
{
    if (i == capacity) 
    {
        capacity = 2 * capacity;
        char (*tmp)[MAX_LEN] = realloc(array, capacity * sizeof *array);
        if (tmp == NULL)
        {
            // Error
            // Add error handling or just:
            exit(1);
        }
        array = tmp;
    }
    strcpy(array[i], line);
    ++i;
}

... do something with array ...

free(array);

推荐阅读