0

我有一个读取输入文件的函数,应该修改 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 循环期间,“当前”值被正确读取,但存储在所有输入 [*] 中,导致:

input[0] = output3.xml
input[1] = output3.xml
input[2] = output3.xml

如果有人知道这里出了什么问题,我将不胜感激。

4

2 回答 2

3

该函数将局部变量的地址存储buffer到数组中的每个元素input:您需要复制strtok(). 目前的代码是未定义的行为,因为buffer一旦input_parser()返回就超出范围,即使不是逻辑也不正确。

如果你有strdup(),你只需使用它:

input[*files] = strdup(strtok(buffer,"\n")); /* NULL check omitted. */

否则malloc()strcpy()。记住何时不再需要free()的元素。input

初始化input以确定哪些元素指向有效字符串:

char* input[25] = { NULL };
于 2012-10-17T14:17:50.500 回答
0

您最终将拥有 danging 指针,这些指针在缓冲区被释放后指向缓冲区内。

于 2012-10-17T14:17:49.177 回答