使用fgets操作结构体成员报错:预期char*但参数为int*如何解决
问题根因
- 编译报错:你的
teams结构体中wins和losses被定义为char数组类型,但初始化的时候直接赋值整数0,整数0会被编译器识别为int *类型的空指针,和char *类型不匹配,所以触发了类型错误提示,你误以为是fgets传参错误,实际问题出在结构体初始化逻辑。 - 胜场负场看不到输出:
fgets的第二个参数传了MAXC=1024,但结构体成员数组的长度只有MAX_SIZE=20,越界写入内存直接冲掉了后续字段的存储内容,属于未定义行为。- 你在两次
fgets之间加的getchar()逻辑错误,会误吃掉正常输入的首字符,同时fgets读取的内容末尾自带换行符,输出的时候会把后续字段挤到下一行,视觉上看不到对应的输出。
修复方案
- 调整
fgets的读取长度为数组实际长度,避免缓冲区溢出。 - 修正结构体初始化逻辑,字符串类型用空字符串初始化;如果胜场负场本来就是数字属性,建议直接改成
int类型存储更合理。 - 移除多余的
getchar(),统一处理fgets读取后残留的换行符,避免输出换行错乱。
修复后代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 20 typedef struct { char name[MAX_SIZE]; // 胜场负场是数字的话更建议用int类型: // int wins; // int losses; char wins[MAX_SIZE]; char losses[MAX_SIZE]; } teams; // 清除fgets读取内容末尾的换行符 void trim_newline(char *str) { size_t len = strlen(str); if (len > 0 && str[len-1] == '\n') { str[len-1] = '\0'; } } int addteam(teams *t) { printf("Name of team > "); fgets(t->name, MAX_SIZE, stdin); trim_newline(t->name); printf("Wins of team > "); fgets(t->wins, MAX_SIZE, stdin); trim_newline(t->wins); // 如果用int类型存储胜场,加这行转换:t->wins = atoi(t->wins); printf("Losses of team > "); fgets(t->losses, MAX_SIZE, stdin); trim_newline(t->losses); // 如果用int类型存储负场,加这行转换:t->losses = atoi(t->losses); return 0; } int main() { // 修正初始化逻辑,字符串类型用空字符串初始化 teams team[MAX_SIZE] = {{ .name = "", .wins = "", .losses = ""}}; for(int i=0; i < 2; i++) { addteam( &team[i] ); } for(int j=0; j<2; j++) { // 如果胜场负场是int类型,对应占位符改成%d即可 printf("team %d name is %s 胜场:%s 负场:%s\n",j+1, team[j].name, team[j].wins, team[j].losses); } return 0; }
内容的提问来源于stack exchange,提问作者Platopysp
相关产品推荐
相关产品推荐

