递归函数:abort-condition

时间:2017-11-28 21:18:09

标签: c

我们需要创建一个包含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;
}

1 个答案:

答案 0 :(得分:0)

有两个项定义了终止递归函数:

  1. 一个或多个基本案例
  2. 向基本案例发展的递归调用

您的代码有一个基本情况:while (lines!=NULL) {} return current;,当linesNULL时,它将中断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