我们需要创建一个包含textfiles内容的二叉树。指针selection_a和selection_b指向direcetory中的另一个文本文件。
文本文件的结构如下: 1. line:标题 2.行:OptionA 3. line:OptionB 4. line:Text。
第一个文件在启动程序时作为参数给出。所有文件都应保存在程序的开头。然后显示第一个文件的文本,用户可以输入A或B继续。根据选择,显示文件选项A / B的文本,他可以再次决定。
树的最后一个文件不包含选项:2。和3.行是" - \ n"。
问题是,此代码只读取第一棵树的所有选项A文件。它没有在任何B选项中读取。最后,程序显示内存访问错误。 我认为问题是,readingRows函数没有中止条件。
current->selection_a = readingRows(input_selection_a);
current->selection_b = readingRows(input_selection_b);
我知道代码可能有点像caotic,但我们是编程的初学者。希望任何人都可以帮助我们写出一个中止条件。 如果选项A(第3行)的内容是" - \ n",则应该中止该功能。
这是整个功能:
struct story_file* readingRows(FILE *current_file)
{
char *buffer = fileSize(current_file);
char *delimiter = "\n";
char *lines = strtok(buffer,delimiter);
int line_counter = 0;
struct story_file *current = malloc(sizeof(struct story_file));
while(lines != NULL)
{
if(line_counter == 0)
{
current->title = lines;
}
else if(line_counter == 1)
{
char *filename_chapter_a = lines;
FILE *input_selection_a = fopen(filename_chapter_a, "r");
if(input_selection_a)
{
current->selection_a = readingRows(input_selection_a);
}
fclose(input_selection_a);
}
else if(line_counter == 2)
{
char *filename_chapter_b = lines;
FILE *input_selection_b = fopen(filename_chapter_b, "r");
if(input_selection_b)
{
current->selection_b = readingRows(input_selection_b);
}
fclose(input_selection_b);
}
else if (line_counter >= 3)
{
current->text = lines;
}
lines = strtok(NULL,delimiter);
line_counter++;
}
return current;
}
答案 0 :(得分:0)
有两个项定义了终止递归函数:
您的代码有一个基本情况:while (lines!=NULL) {} return current;
,当lines
为NULL
时,它将中断while循环并返回current
。换句话说,在对函数的任何特定调用中,它仅在到达文件末尾时终止。
只要您的文件不在循环中互相引用,您的代码就会朝着这种基本情况发展。我们之所以知道这一点,是因为您总是读取一行,根据if-else块执行操作,然后读取下一行。因此,您始终将其移至每个阅读文件的末尾。
但是请注意,问题在于第2行或第3行为“-\ n”时,您没有案例来处理“无选项”。因此,现在,即使您浏览文件,也总是在第2行中打开文件。除非文件格式错误并且不包含第2行,否则递归调用树永远不会结束。因此,您只需要添加另一种基本情况,即检查行的开头是否匹配“-\ n”,如果匹配,则在递归调用之前返回。这将结束递归树的该分支。
在while循环中,您将需要以下代码:
if `line_counter` is `2` or `3`
if `lines` starts with your terminating sequence "-\n"
return current
else
`fopen` and make the recursive call
在进行递归调用的父函数中,它将移至下一行并按预期继续。
P.S。确保对每次执行的free
使用malloc
。