使用 fgets 遍历文件时追加到数组

Appending to array while iterating over file using fgets

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

当尝试访问数组时,我在访问值 array[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]
}

您的代码有两个错误。

  1. 没有记忆array

  2. 你一直把line的地址存入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);

首先,您必须对数组进行维数。否则,它将由其初始化程序确定尺寸。由于您的初始值设定项为空,因此您的数组也为空。

所以,如果你想存储一百行,你应该写:

char *array[100] = {};

(我用数组的静态维度来解释这个,因为动态分配方法有点复杂)

然后,当你写下你的行时:

array[i] = line;

你知道你在用指针工作吗?

line表示存放line行字符的缓冲区地址。然后你将变量 line 的这个地址分配给一个指针数组。

array[1] 是你的指针数组的第二个指针。 (因为数组索引在 C 中以 0 开头) 存在分段,因为您的数组包含零值,因此您无法访问第二个(不存在的)值。

此外,您始终将相同的地址(变量 line 的地址分配给数组的每个条目。

事实上你只有一个,你在你的数组

中复制了它的地址

有多个错误会阻止您将文件的所有行存储在数组中。

我会尽快编辑此 post 以向您提供您正在尝试执行的工作的示例。