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

使用fgets操作结构体成员报错:预期char*但参数为int*如何解决

问题根因

  • 编译报错:你的teams结构体中wins和losses被定义为char数组类型,但初始化的时候直接赋值整数0,整数0会被编译器识别为int *类型的空指针,和char *类型不匹配,所以触发了类型错误提示,你误以为是fgets传参错误,实际问题出在结构体初始化逻辑。
  • 胜场负场看不到输出:
    1. fgets的第二个参数传了MAXC=1024,但结构体成员数组的长度只有MAX_SIZE=20,越界写入内存直接冲掉了后续字段的存储内容,属于未定义行为。
    2. 你在两次fgets之间加的getchar()逻辑错误,会误吃掉正常输入的首字符,同时fgets读取的内容末尾自带换行符,输出的时候会把后续字段挤到下一行,视觉上看不到对应的输出。

修复方案

  1. 调整fgets的读取长度为数组实际长度,避免缓冲区溢出。
  2. 修正结构体初始化逻辑,字符串类型用空字符串初始化;如果胜场负场本来就是数字属性,建议直接改成int类型存储更合理。
  3. 移除多余的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:57:04