C语言enum搭配switch-case使用时任意输入均命中male分支问题求助
问题根因
- C 语言中枚举常量默认从 0 开始依次赋值,上述代码中
male对应整数值 0,female对应整数值 1。 - 核心错误1:
scanf使用%u(无符号整数格式符)读取枚举变量,而枚举的默认底层实现是signed int,类型不匹配会触发未定义行为,读取结果不可控。如果输入非数字内容,scanf会直接读取失败,不会修改目标变量的值。 - 核心错误2:枚举变量
choice未初始化,局部变量在栈上的初始值是随机的,若读取失败时残留值恰好为 0,就会每次都命中male分支。 - 给 case 后的值加引号的操作完全错误:加单引号会变为字符常量,和枚举对应的整数值完全不匹配,无法解决问题。
修复方案
- 初始化枚举变量,设置初始值为有效值外的数,避免残留值干扰
- 将
scanf格式符改为和枚举底层类型匹配的%d - 增加
scanf返回值判断,确认用户输入了合法整数 - 增加输入提示,告知用户合法的输入值范围
修复后的可运行代码如下:
#include <stdio.h> #include <stdlib.h> enum gender {male, female}; int main () { // 初始值设为超出有效值的2,避免未初始化随机值干扰 enum gender choice = 2; printf("Your gender: 输入0代表男性,1代表女性\n"); // 判断scanf返回值,确认成功读取到1个整数 if (scanf("%d", &choice) != 1) { printf("输入错误,请输入合法整数\n"); // 清空输入缓冲区残留的非法字符 while(getchar() != '\n'); return 1; } switch(choice) { case male: printf("You're a man.\n"); break; case female: printf("You're a woman.\n"); break; default: printf("Try again.\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Dragesia
相关产品推荐
相关产品推荐

