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

在C语言中使用数组与结构体时遇到fgets参数类型不兼容问题的求助

问题根源:结构体成员访问错误

嘿,我一眼就看到问题所在了——你在调用fgets和fscanf的时候,都搞错了结构体数组元素的访问方式!

1. fgets参数类型不匹配的直接原因

你当前传递给fgets的Equipos[i]是整个sEquipo结构体实例,而fgets的第一个参数要求是char*类型(指向字符缓冲区的指针)。根据你的结构体定义,应该访问结构体中的nombre成员,它才是符合要求的字符数组。

正确的写法应该是:

fgets(Equipos[i].nombre, DIM_NOMBRE_EQUIPO, equipos);

(这里直接用你定义的DIM_NOMBRE_EQUIPO宏,比写40-1更清晰,也避免硬编码错误)

2. fscanf的隐藏类型错误

你可能没注意到,fscanf("%d", Equipos[i])这里同样存在问题:%d格式符需要接收一个int*类型的指针来存储读入的整数,但你传递的是整个结构体。正确的写法应该是取结构体中id_equipo成员的地址:

while(fscanf(equipos, "%d", &Equipos[i].id_equipo) == 1)

修正后的完整代码片段

else
{
    while(fscanf(equipos, "%d", &Equipos[i].id_equipo) == 1)//循环读取文件直到没有id_equipo类型的整数
    {
        // 吃掉fscanf后留在缓冲区的换行符,避免fgets读到空行
        getchar();
        fgets(Equipos[i].nombre, DIM_NOMBRE_EQUIPO, equipos);
        // 可选:去掉fgets读入的末尾换行符
        size_t len = strlen(Equipos[i].nombre);
        if (len > 0 && Equipos[i].nombre[len-1] == '\n') {
            Equipos[i].nombre[len-1] = '\0';
        }
        i++;
    }
    fclose(equipos);
    return i;//返回已注册团队的数量i
}

额外说明

  • fscanf读取整数后,文件指针会停在整数后的空白字符(通常是换行),直接调用fgets会读取这个空换行,导致nombre被设置为空字符串,所以需要用getchar()提前吃掉这个换行。
  • fgets会把换行符也读入缓冲区,所以如果不需要保留换行,可以手动替换为字符串结束符\0,就像上面代码里做的那样。

内容的提问来源于stack exchange,提问作者HoneyPot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:57:43