0

私のプログラムが想定どおりに動作しているかどうかは本当に混乱しています。これは宿題ではなく、私が書いている楽しい行進狂気予測プログラムです。

    char buffer[20];
    char team1_name[20];    // 18 chars + new line + null
    char team2_name[20];

    printf("Who is team 1?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team1_name, buffer, sizeof(team1_name));
    team1_name[strlen(team1_name) - 1] = '\0';

    printf("\nWho is team 2?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team2_name, buffer, sizeof(team2_name));
    team2_name[strlen(team2_name) - 1] = '\0';

    printf("\nEnter %s's info:\n", team1_name);

好奇心から、20文字を超えるチーム名を入力すると、2番目の印刷ステートメントが完全にスキップされます。バッファオーバーフローから保護していますか?巨大なものを入れないのはユーザー次第ですか?フラッシュステートメントが必要ですか?

これは出力です:

    Who is team 1?
    wjefowiejfwoiejfweoifjweoifjweofijweoifj

    Who is team 2?

    Enter wjefowiejfwoiejfwe's info:
    Wins in last 12:

    Losses in last 12:

    Points per game:
4

2 に答える 2

1

問題は、入力が最初のfgets(20文字以上ある)で切り捨てられるため、2番目のfgetsがstdinから最初の入力文字列の終わりを読み取ることです。

「team2_name」の値を表示して表示します(team1_nameの最初の20文字の後に文字が含まれています)。

申し訳ありませんが、次のコメントは間違っていました。それを忘れてください:そして、はい、この引数は読み取られる文字の最大数であるため、fgetsはsizeof(buffer)-1を使用する必要があります。したがって、sizeof(buffer)文字を読み取る場合、それらを格納するにはsizeof(buffer)+1文字が必要になります(末尾の「\ 0」を含む)

于 2012-03-13T07:48:19.293 に答える
1

stdinから20文字を読み取りましたが、残りの入力はまだストリームに残っています。次fgetsはそれらの残りの文字を読み取るので、Team1が呼び出されwjefowiejfwoiejfwe、 Team2が呼び出されますoifjweofijweoifj。Team2の名前も印刷すると、これが正しいことがわかります。

于 2012-03-13T07:49:10.543 に答える