将枚举值赋值给同类型数组时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
相关产品推荐
相关产品推荐

