与fscanf奇怪的异常和变量声明的顺序

时间:2013-05-24 21:15:21

标签: c variables declaration scanf

我有这段代码来读取文件并将所有内容解析为人员列表:

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 中保存任何字符串? 希望有人能解释这种奇怪的行为。感谢。

1 个答案:

答案 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);
}