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

将枚举值赋值给同类型数组时scanf警告问题及方案咨询

枚举类型数组赋值的警告问题

我想把枚举值赋值给枚举类型的数组,但一直收到警告:format '%d' expects argument of type 'int *', but argument 2 has type tShipType *。

枚举定义如下:

typedef enum {TRANSPORT = 1, FIGHTER, MEDICAL, EXPLORER} tShipType;

对应的枚举类型数组变量:

// Variable definitions

tShipType shipTypes[MAX_SHIPS];          // Ships type

我原来的输入代码是:

// Type of ship
printf("SHIP TYPE (TRANSPORT=1, FIGHTER=2, MEDICAL=3, EXPLORER=4)?\n");
scanf("%d", &shipTypes[i]);

请问是不是应该改成下面这种写法?

int intTo_tShipType;

// Type of ship
printf("SHIP TYPE (TRANSPORT=1, FIGHTER=2, MEDICAL=3, EXPLORER=4)?\n");
scanf("%d", &intTo_tShipType);
shipTypes[i] = intTo_tShipType;

解答

是的,必须改用第二种写法,核心原因是C语言的类型规则:

  • 枚举类型本质是整数,但tShipType和int是不同的类型。scanf的%d格式符要求传入int*类型的指针,而&shipTypes[i]是tShipType*,类型不匹配就会触发警告,甚至可能在某些平台导致未定义行为。

  • 第二种写法先将输入读入int变量,再赋值给枚举变量,是符合标准的安全做法。额外建议你增加输入合法性检查,避免无效值进入枚举数组:

int intTo_tShipType;

printf("SHIP TYPE (TRANSPORT=1, FIGHTER=2, MEDICAL=3, EXPLORER=4)?\n");
scanf("%d", &intTo_tShipType);
// 检查输入是否在枚举的有效范围内
if (intTo_tShipType >= TRANSPORT && intTo_tShipType <= EXPLORER) {
    shipTypes[i] = (tShipType)intTo_tShipType; // 显式类型转换更规范
} else {
    printf("无效的飞船类型!\n");
    // 可添加错误处理逻辑,比如重新输入
}

不要尝试直接把tShipType*强转为int*传给scanf,这种写法属于未定义行为,跨平台兼容性极差,绝对不能用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:23:56