如果我的程序按照预期的方式运行,真是很困惑。这不是家庭作业,只是我正在编写的一个有趣的进行曲疯狂预测程序。

    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个字符的团队名称,它完全跳过了第二个打印声明。我可以防止缓冲区溢出吗?是否由用户决定不投入大笔费用?我需要冲洗语句吗?

这是输出:

    Who is team 1?
    wjefowiejfwoiejfweoifjweoifjweofijweoifj

    Who is team 2?

    Enter wjefowiejfwoiejfwe's info:
    Wins in last 12:

    Losses in last 12:

    Points per game:

最佳答案

问题是,由于您的输入在第一个fget中被截断(您有20个以上的字符),因此第二个fget将从stdin读取FIRST输入字符串的末尾。

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

糟糕,抱歉,以下评论有误。忘掉它 :
是的,fget必须使用sizeof(buffer)-1,因为此参数是读取的最大字符数。因此,如果您读取sizeof(buffer)个字符,则需要sizeof(buffer)+1个字符来存储它们(包括结尾的'\ 0')

10-06 14:27