返回

如何解决 `ReadPersonData` 函数中的爱好读入错误?

Linux

修正 ReadPersonData 函数中的爱好读入错误

问题概述

ReadPersonData 函数中,存在一个错误,导致爱好计数从 3 变为 2 时,爱好读入停止。这是因为 for 循环中的 i 值大于个人的爱好计数。

解决方法

要解决此问题,我们需要修改 for 循环的参数。具体来说,我们需要使用爱好计数作为循环限制,而不是硬编码的 MAX_HOBBIES

修改后的代码

for (i = 0; i < personList[persons].hobbyCount; i++)
{
  fscanf(fPerson, "%s", personList[persons].hobbies[i]);
}

修改后的完整函数

int ReadPersonData(person personList[], int limit, char *fName)
{

  int persons = 0;
  int i;

  FILE *fPerson = fopen(fName, "r");
  if (fPerson == NULL)
  {
    fprintf(stderr, "Error opening input file %s", fName);
    perror(" ");
    return persons;
  }

  while (fscanf(fPerson, "%s %s %s %s %d", personList[persons].name,
                                         personList[persons].residence.country,
                                         personList[persons].residence.city,
                                         personList[persons].residence.street,
                                         &personList[persons].hobbyCount) == 5)

  {

    if (personList[persons].hobbyCount < MIN_HOBBIES ||
        personList[persons].hobbyCount > MAX_HOBBIES)
    {
      printf("ERROR! Invalid hobby count for %s, exiting now!\n",
             personList[persons].name);
      exit(1);
    }

    for (i = 0; i < personList[persons].hobbyCount; i++)
    {
      fscanf(fPerson, "%s", personList[persons].hobbies[i]);
    }

    persons++;

    if (persons > limit)
    {
      fprintf(stderr, "ERROR! Input file is too long! ALlowed "
                      "limit is %d entries. Reading of the "
                      "file has stopped, continuing within "
                      "a partial dataset\n", limit);
      break;
    }
  }

  fclose(fPerson);

  return persons;
}

结论

通过修改 for 循环的参数,我们可以确保 ReadPersonData 函数正确读入所有爱好,从而解决爱好读入错误问题。

常见问题解答

1. 为什么原来的 for 循环在爱好计数从 3 变成 2 时停止读入爱好?
因为原来的 for 循环使用硬编码的 MAX_HOBBIES 作为循环限制,当爱好计数为 2 时, i 值会大于爱好计数,导致循环结束。

2. 为什么我们使用爱好计数作为新的循环限制?
爱好计数是个人拥有的爱好数量,它可以确保我们只遍历当前个人的爱好,从而正确读入所有爱好。

3. 除了修改 for 循环的参数之外,还有什么其他方法可以解决此问题?
另一种方法是动态分配爱好数组,根据爱好计数分配适当的大小。这将消除硬编码的 MAX_HOBBIES 限制,并确保我们始终有足够的空间来存储所有爱好。

4. 为什么修改 for 循环的参数更简单?
修改 for 循环的参数不需要重新设计数据结构或编写复杂代码。它是一种简单而直接的方法,可以解决这个问题。

5. 此修复是否适用于其他类似情况?
此修复适用于任何在读入数据时需要遍历不定数量的元素的情况。通过使用循环限制来匹配元素数量,我们可以确保正确读取所有数据,而不会出现过读或漏读的情况。