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