c-在使用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 = %sn", 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;

你意识到你在用指针工作吗?

表示存储字符的缓冲区地址。您将变量的地址分配给指针数组。

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

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

事实上,您只有一个,其地址在数组中重复

有多个错误将阻止您将文件的所有行存储在阵列中。

我会尽快编辑这篇文章,为你提供一个你想要做的工作示例

相关内容

  • 没有找到相关文章

最新更新