将 fgets 与字符数组一起使用

Using fgets with character array

我是菜鸟,需要帮助。

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

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 试图写入作为第一个参数提供给它的地址,这就是它试图访问一些非法或 not-permitted-to-access 内存导致段-故障)。

分配一些不会出现段错误的内存。

char *arg[41] 是 41 个 char* 的数组,而不是 char 的数组,并且这些指针不指向任何相关内存。

#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[]);

如当前所写,您正在定义一个包含 41 个字符的指针数组,而不是一个指向包含 41 个字符的数组的指针.因为 operator precedence:

你需要把它括起来
char (*args)[41];
     ^     ^

此外,您还没有为那些指向的指针分配任何space。你的程序应该得到 malloc()。看了你的程序,我猜你可能是这个意思:

char (*args)[41] = malloc(sizeof(*args));

那么它应该会继续工作。记得free().