为何程序自动将Player1的姓名设为空白?C语言输入问题求助
问题:输入玩家数量后Player1姓名自动为空的原因及解决办法
你的C语言代码如下:
#include <stdio.h> #include <string.h> #include <time.h> int playernumber(); struct Player { char name[20]; int score; }; int main() { int num = playernumber(); struct Player players[num]; int i = 1; while( i <= num) { printf("\nWhat's Player%d's name: ", i); fgets(players[i].name , 20, stdin); players[i].name[strlen(players[i].name) - 1] = '\0'; printf("%s", players[i].name); i++; } } int playernumber() { int num; printf("Welcome! How many players are there? "); do { scanf("%d", &num); if(num<0 || num>4) { printf("Too few or too many players, enter a player number again: "); } }while(num<0 || num>4); return num; }
问题原因
不是fgets本身用错,是scanf读取玩家数量后,输入缓冲区里残留了换行符。当你用scanf("%d", &num)输入数字并按回车时,scanf只取走了数字,回车对应的\n还留在标准输入缓冲区里。第一个fgets执行时,直接读取了这个换行符,之后你把读取到的字符串最后一个字符(也就是\n)替换成\0,结果就变成了空字符串。
另外还有一个隐藏问题:C语言数组下标是从0开始的,你代码里循环用i=1到num,访问players[i]会越界(比如num=4时,players[4]超出了数组范围),这可能导致程序崩溃或其他异常。
解决办法
- 清除输入缓冲区的换行符
在playernumber函数的return num;之前,加上一行getchar();,吃掉scanf留下的换行符:
int playernumber() { int num; printf("Welcome! How many players are there? "); do { scanf("%d", &num); if(num<0 || num>4) { printf("Too few or too many players, enter a player number again: "); } }while(num<0 || num>4); getchar(); // 新增:吃掉换行符 return num; }
- 修正数组下标问题
把main里的循环改成从0开始,输出玩家编号时用i+1:
int main() { int num = playernumber(); struct Player players[num]; int i = 0; // 从0开始 while( i < num) // 条件改为i < num { printf("\nWhat's Player%d's name: ", i+1); // 显示i+1作为玩家编号 fgets(players[i].name , 20, stdin); // 额外判断:如果读取到的字符串长度大于0,再替换换行符 if(strlen(players[i].name) > 0) { players[i].name[strlen(players[i].name) - 1] = '\0'; } printf("%s", players[i].name); i++; } }
- 更稳妥的输入方式(可选)
如果不想处理缓冲区问题,可以用fgets读取玩家数量的输入,再用atoi转换成整数,这样能彻底避免残留字符的问题:
int playernumber() { int num; char input[10]; printf("Welcome! How many players are there? "); do { fgets(input, sizeof(input), stdin); num = atoi(input); if(num<0 || num>4) { printf("Too few or too many players, enter a player number again: "); } }while(num<0 || num>4); return num; }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

