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

C语言enum搭配switch-case使用时任意输入均命中male分支问题求助

问题根因
  • C 语言中枚举常量默认从 0 开始依次赋值,上述代码中 male 对应整数值 0,female 对应整数值 1。
  • 核心错误1:scanf 使用 %u(无符号整数格式符)读取枚举变量,而枚举的默认底层实现是 signed int,类型不匹配会触发未定义行为,读取结果不可控。如果输入非数字内容,scanf 会直接读取失败,不会修改目标变量的值。
  • 核心错误2:枚举变量 choice 未初始化,局部变量在栈上的初始值是随机的,若读取失败时残留值恰好为 0,就会每次都命中 male 分支。
  • 给 case 后的值加引号的操作完全错误:加单引号会变为字符常量,和枚举对应的整数值完全不匹配,无法解决问题。
修复方案
  1. 初始化枚举变量,设置初始值为有效值外的数,避免残留值干扰
  2. 将 scanf 格式符改为和枚举底层类型匹配的 %d
  3. 增加 scanf 返回值判断,确认用户输入了合法整数
  4. 增加输入提示,告知用户合法的输入值范围

修复后的可运行代码如下:

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:15:03