c - 在使用 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]
}
解决方案
您的代码有两个错误。
没有记忆
array
您继续存储
line
into的地址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);
推荐阅读
- android - firebase 回收器适配器显示空指针异常
- akka - AKKA:如何使用 BackoffSupervisor 提供最大重试次数?
- java - 由于 List 是一个接口以及我们如何在没有任何匿名类的情况下创建实例
- php - CI中force_download后如何刷新页面
- javascript - 是否有将用户生日设置为 null、空或默认值的解决方案?
- java - GDPR 自己的同意对话框
- java - 如果任何 EditText 为空,如何禁用按钮?
- mysql - 我尝试生成从我的关系模型中检索所有字段的查询并成功捕获查询
- django - 是否可以进行模糊过滤搜索?(过滤一组值的字段)
- c# - linq 查询异步/等待审查