0

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

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;
}

该文件的格式如下:

亚历山大·沃尔纳 1922 年 1957 年伯特伦·霍尔比希勒 1905 年赫敏·沃尔纳 1904 年

字符串字符串 char int int string string int string string int

所以,我试图得到这个人,然后是父母。奇怪的是printf没有打印出这个人的fname。如果我在fscanf中更改fnamename的顺序,则第一个字符串保存在name中,但第二个不在fname中。这种好奇心取决于在第 5,6 行中声明fanamename的顺序。如果我把它们转过来,名字就不再填满了。那是什么黑客?为什么我不能在fname中保存任何字符串?希望有人能解释这种奇怪的行为。谢谢。

4

1 回答 1

4

用于%c读取 achar而不是%1s%s 往常一样写入空终止符,因此代码具有未定义的行为,这意味着任何事情都可能发生,因为它超出了gender. 同样,当printf()ing%c用于类型的变量时char(正如您正确拥有的那样)。

格式说明符中的宽度%Ns必须比目标缓冲区小一以允许空终止字符。改成:

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);
}
于 2013-05-24T21:18:00.400 回答