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 个字符的团队名称,它完全跳过了第二个打印语句。我是否在防止缓冲区溢出?是否由用户决定不要放入巨大的东西?我需要flush语句吗?

这是输出:

    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 个字符),那么第二个 fgets 将从标准输入读取第一个输入字符串的结尾。

显示“team2_name”值以查看它(它包含 team1_name 中前 20 个字符之后的字符)。

哎呀,对不起,下面的评论是错误的。忘了它:是的,fgets 必须使用 sizeof(buffer)-1,因为这个参数是读取的最大字符数。因此,如果您读取 sizeof(buffer) 字符,则需要 sizeof(buffer)+1 字符来存储它们(包括尾随 '\0')

于 2012-03-13T07:48:19.293 回答
1

您从标准输入中读取了 20 个字符,但输入的其余部分仍保留在流中。接下来fgets读取那些剩余的字符,因此调用 Team1wjefowiejfwoiejfwe和 Team2 oifjweofijweoifj。打印 Team2 的名字,你会发现这是真的。

于 2012-03-13T07:49:10.543 回答