Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将FGET与字符数组一起使用_C_Arrays_Pointers_Fgets - Fatal编程技术网

C 将FGET与字符数组一起使用

C 将FGET与字符数组一起使用,c,arrays,pointers,fgets,C,Arrays,Pointers,Fgets,我是努布,需要帮助 我正在将文件读入一个字符数组,然后尝试将该数组赋给我的自定义函数 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} 该文件已存在,其中包含多行文本。当我

我是努布,需要帮助

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

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是seg错误,但是我的函数需要这样才能让程序的其余部分正常工作。当不尝试读取此文件时,程序工作正常。文件的每行不应超过40个字符。我相信fgets将读取多达40个字符,然后还会添加一行新行?为了以防万一,我将数组大小设为41。无论如何,我也尝试过创建一个普通的字符数组,但是myFunction不会接受它(而且我不能轻易地更改该函数)。怎么办?

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

分配一些不会给SEGFULT的内存

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);
如果您想要传递整个字符指针数组,那么签名将是

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

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

分配一些不会给SEGFULT的内存

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);
如果您想要传递整个字符指针数组,那么签名将是

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

正如目前所写的,您正在定义一个由41个字符组成的数组,而不是一个指向41个字符组成的数组的指针。您需要将其括起来,因为:

此外,您还没有为这些指针分配任何指向的空间。您应该使用程序获得
malloc()
。阅读你的节目,我猜你的意思是:

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

然后它应该继续工作。请记住
free()

正如当前编写的那样,您正在定义一个由41个字符组成的数组,而不是一个指向41个字符组成的数组的指针。您需要将其括起来,因为:

此外,您还没有为这些指针分配任何指向的空间。您应该使用程序获得
malloc()
。阅读你的节目,我猜你的意思是:

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

然后它应该继续工作。请记住
free()

@iBug.:我更专注于向OP提供seg故障的原因。一种可能的摆脱方法。在malloc中LEN的用途是什么?为什么选择100?@V1rtua1An0ma1y.:您可以选择
LEN
作为您想要保存的
字符的最大数量+1
,因为将有一个额外的
\n
@iBug.:我更专注于提供OP seg故障的原因。一种可能的解决方法。在malloc中LEN的用途是什么?为什么选择100?@V1rtua1An0ma1y:您可以选择
LEN
作为您想要保存的
字符的最大数量+1
,因为将有一个额外的
\n