返回
如何解决 `ReadPersonData` 函数中的爱好读入错误?
Linux
2024-03-26 21:33:17
修正 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. 此修复是否适用于其他类似情况?
此修复适用于任何在读入数据时需要遍历不定数量的元素的情况。通过使用循环限制来匹配元素数量,我们可以确保正确读取所有数据,而不会出现过读或漏读的情况。