You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何程序自动将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]超出了数组范围),这可能导致程序崩溃或其他异常。

解决办法

  1. 清除输入缓冲区的换行符
    在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;
}
  1. 修正数组下标问题
    把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++;
    }
}
  1. 更稳妥的输入方式(可选)
    如果不想处理缓冲区问题,可以用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:25:02