我有这段代码来读取文件并将所有内容解析为人员列表:
PersonList *parseFile(FILE* file) {
PersonList *list = newPersonList();
int r;
do {
char fname[50];
char name[50];
char gender;
int birthYear;
int deathYear;
r = fscanf(file, "%50s %50s %1s %d %d", fname, name, &gender, &birthYear, &deathYear);
printf("%s %s %c %d %d\n", fname, name, gender, birthYear, deathYear);
// Stuff I want to do in future
} while (r != EOF);
return list;
}
该文件的格式如下:
Alexander Wallner 1922年1957年Bertram Hohlbichler 1905 Hermine Wallner 1904
string string char int int string string int string string int
所以,我试图找到那个人,然后是父母。奇怪的是 printf 不会打印出该人的 fname 。如果我在 fscanf 中更改 fname 和 name 的顺序,而不是第一个字符串保存在 name 中,但是第二个不在 fname 。 这种好奇心取决于第5,6行中 faname 和 name 的声明顺序。如果我转过它们, name 就不再填充了。这是什么黑客?为什么我无法在 fname 中保存任何字符串? 希望有人能解释这种奇怪的行为。感谢。
答案 0 :(得分:4)
使用%c
来阅读char
而非%1s
,因为%s
始终写入空终结符,因此代码为{{3} },意思是任何事情都可能发生,因为它超越了gender
的“界限”。同样,当printf()
使用%c
用于char
类型的变量时(正如您所拥有的那样)。
格式说明符%Ns
中的宽度必须比目标缓冲区小1,以允许空终止字符。
改为:
r = fscanf(file, "%49s %49s %c %d %d", ...
/* ^^ ^^ ^ */
在使用fscanf()
指定的变量之前,请确保通过检查fscanf()
的结果来实际分配它们,这会返回成功分配的数量(在这种情况下,5
是预期的):
if (r == 5)
{
printf("%s %s %c %d %d\n", fname, name, gender, birthYear, deathYear);
}