gpt4 book ai didi

c - 将 fgets 与字符数组一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:53 24 4
gpt4 key购买 nike

我是菜鸟,需要帮助。

我正在从一个文件中读入一个字符数组,然后尝试将该数组提供给我的自定义函数。

char *args[41];
FILE *f;
int hist = 0;

f = fopen("file.test", "a+");

while(fgets(*args, 40, f))
{ myFunction(hist, args);
hist++; }

功能:

void myFunction(int idx, char *args[])
{stuff}

该文件存在并且其中有几行文本。当我使用指针数组时,fgets 出现段错误,但是我的函数需要这样才能使程序的其余部分正常工作。该程序在不尝试读取此文件时工作正常。文件的每一行不应超过 40 个字符。我相信 fgets 最多会读取 40 个字符,然后还会添加一个新行?为了以防万一,我将数组大小设置为 41。无论如何,我也尝试创建一个普通的 char 数组,但 myFunction 不会接受它(而且我不能轻易更改该函数)。做什么?

最佳答案

fgets 是段错误,因为这些指针没有指向任何有效内存。您正在访问一个未初始化的指针,这是未定义的行为。(fgets 尝试写入作为第一个参数提供给它的地址,这就是它尝试访问一些非法或 不允许的地址-to-access 内存导致段错误)。

分配一些不会产生段错误的内存。

char *arg[41] 是一个包含 41 个 char* 的数组,而不是 char 的数组,那些指针不't 指向任何相关内存。

#define LEN 100

for(size_t i = 0; i<41; i++)
arg[i] = malloc(sizeof *arg[i] *LEN);
if( arg[i] == NULL){
fprintf(stderr,"Error in malloc");
exit(1);
}
...
size_t i = 0;
while(fgets(args[i], 40, f)) //read into each of the character array
{
hist++;
i++;
}
myFunction(hist, args);

现在 arg[i] 指向动态分配的内存,这与之前的情况不同。不要忘记释放动态分配的内存。

如果您想将每个读取的字符串(空终止 char 数组)传递给函数,那么签名将是

void myFunction(int index,char* arg); //accessing the char array

如果您想传递整个 char 指针数组,那么签名将是

void myFunction(int index,char* args[]);

关于c - 将 fgets 与字符数组一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47524324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com