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

ファイルの形式は次のとおりです。

Alexander Wallner m 1922 1957 Bertram Hohlbichler 1905 Hermine Wallner 1904

文字列 文字列 char int int 文字列 文字列 int 文字列 文字列 int

それで、私はその人を取得しようとし、次に両親を取得しようとします。奇妙なことに、printfはその人のfnameを出力しません。fscanfでfnamenameの順序を変更すると、最初の文字列はnameに保存されますが、2 番目の文字列は fname には保存されませこの好奇心は、5、6 行目のfanamenameの宣言の順序に依存します。ひっくり返すと名前が埋まらない。それは何のハックですか?fnameに文字列を保存できないのはなぜですか? 誰かがこの奇妙な振る舞いを説明できることを願っています。ありがとう。

4

1 に答える 1

4

%cの読み取りに使用し、常にヌル ターミネータを書き込むcharわけではないため、コードの動作は未定義です。同様に、タイプの変数を使用する場合(正しく持っているように)。%1s%s genderprintf()%cchar

書式指定子の幅は%Ns、null 終了文字を許可するために、ターゲット バッファーよりも 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);
}
于 2013-05-24T21:18:00.400 に答える