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]
}
您的代码有两个错误。
-
array
没有内存 -
您一直将
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开始(存在分段,因为您的数组包含零值,所以您无法访问第二个(不存在的(值。
此外,您总是将相同的地址(变量行的地址(分配给数组的每个条目。
事实上,您只有一个行,其地址在数组中重复
有多个错误将阻止您将文件的所有行存储在阵列中。
我会尽快编辑这篇文章,为你提供一个你想要做的工作示例