c - 这是缓冲区溢出吗?

标签 c buffer-overflow fflush

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

    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:

最佳答案

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

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

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

关于c - 这是缓冲区溢出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680023/

相关文章:

c - strtod 如何转换我的参数?

C 在主函数中显示(打印),而在自定义函数中返回值

c++ - OpenCL 或 CUDA 走哪条路?

c - 缓冲区溢出在 x86 上需要 16 个字节,但在 x64 上需要 29 个字节

在无限 for 循环 C 程序中使用 getchar() 后,无法使用 fflush(stdin) 清除标准输入

awk - 从实时 tcpdump 捕获中提取唯一 IP

c - 在 GPU 上使用随机数

c - 缓冲区漏洞问题 - 生成 Shell

c - scanf的宽度规范和scanf_s的区别

使用 fflush 的时钟不清除屏幕