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