在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
相关产品推荐
相关产品推荐

