gpt4 book ai didi

c - 使用递归函数读取数据

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:30 25 4
gpt4 key购买 nike

我正在从文件中读取一些数据,这些数据相互嵌套(如文件树)以将其放入数组中。

读取很好,但我无法将数组放回 main()。 AnzGrid 的结果为 0,因此 for 循环不会开始。

有没有人提示我该怎么做?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void read_include(int,int*,char*);

void read_include(int AnzGrid,int* GridIDs,char* Input){
char Line[81];
char* Token;
FILE * File;
FILE * File1;

File = fopen(Input,"r");
printf("opening %s\n",Input);

if (!File){
printf("%s not found here\n",Input);
return;
}
if (File){
while (fgets(Line,80,File)){
printf("%s",Line);
if (strncmp(Line,"GRID ",8) == 0){
Token=strtok(Line," ");
Token=strtok(NULL," ");
GridIDs[AnzGrid] =atoi(Token);
AnzGrid++;
}
if (strncmp(Line,"INCLUDE ",8) == 0){
Token=strtok(Line,"'");
Token=strtok(NULL,"'");
read_include(AnzGrid,GridIDs,Token);
}
}
fclose(File);
}
printf ("%i\n",AnzGrid);
return;
}


int main( int argc, char* argv[] ) {
char Input[81];
int i;
int AnzGrid;
int GridIDs[100];
strcpy(Input,argv[1]);


read_include(AnzGrid,GridIDs,Input);
printf ("=>%i\n",AnzGrid);

for (i=0;i<AnzGrid;i++){
printf ("GridID: %i\n",GridIDs[i]);
}

最佳答案

这是因为当您将参数传递给函数时,它们是按值传递的,换句话说,您传递的参数的值在函数中被复制。这也意味着您对函数内部参数所做的任何更改都会在副本上进行,一旦函数返回,这些更改就会丢失。

在 C 中基本上有两种方法可以解决这个问题:

  1. 使用return

    从函数返回值
  2. 模拟 pass by reference通过传递指向数据的指针,并在函数内部使用取消引用运算符。

第二种选择可能需要一些示例代码:

/* Passing `AnzGrid` as a pointer */
void read_include(int *AnzGrid,int* GridIDs,char* Input){
...
(*AnzGrid)++; /* Using the dereference operator */
...
}

不是通过将 AnzGrid 声明为指针来调用该函数,而是使用寻址运算符:

int main(...) {
int AnzGrid = 0; /* Initialize */

...

read_include(&AnzGrid,GridIDs,Input); /* Note use of address-of operator `&` */

...
}

注意:main 函数的代码片段中,我还修复了您的另一个错误,该错误导致 undefined behavior :您没有初始化 AnzGrid 变量。局部变量不会自动初始化,而是它们的值不确定(并且看起来是随机的)。使用未初始化的局部变量而不对其进行初始化会导致上述未定义的行为。例如,如果 AnzGrid 有一个不确定的值,AnzGrid++ 会做什么,结果会是什么?

关于c - 使用递归函数读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25034793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com