我有一个读取输入文件的函数,应该修改char **和int *的内容。功能如下:
void
input_parser(arguments* args, char** input, int* files) {
char buffer[MAX];
FILE *fr;
fr = fopen(args->file,"r");
if (fr == NULL) {
printf("No correct input file was entered\n");
exit(0);
}
while(fgets(buffer,MAX,fr) != NULL) {
input[*files] = strtok(buffer,"\n");
(*files)++;
}
fclose(fr);
return;
}
我在主程序中定义了如下输入和文件:
char* input[25];
files = 0;
我按如下方式调用该函数:
input_parser(args, input, &files);
输入文件包含3行,如下所示:
output1.xml
output2.xml
output3.xml
我注意到在while循环期间,'current'值被正确读取但存储在所有输入[*]中导致:
input[0] = output3.xml
input[1] = output3.xml
input[2] = output3.xml
如果有人知道这里出了什么问题,我将不胜感激。
答案 0 :(得分:3)
该函数将局部变量buffer
的地址存储到input
数组中的每个元素:您需要复制strtok()
返回的值。它所代表的代码是未定义的行为,因为buffer
一旦input_parser()
返回就超出范围,即使逻辑不正确也是如此。
如果您有strdup()
,则只需使用它:
input[*files] = strdup(strtok(buffer,"\n")); /* NULL check omitted. */
否则malloc()
和strcpy()
。 <!1}}当不再需要时,请记住free()
的元素。
初始化input
以确定哪些元素指向有效字符串:
input
答案 1 :(得分:0)
你将最终拥有悬空指针,这些指针在缓冲区被释放后指向缓冲区内。