将 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()
.
我是菜鸟,需要帮助。
我正在从一个文件读取一个字符数组,然后尝试将该数组提供给我的自定义函数。
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()
.