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

如何优化实现返回enum month对应月份名称的monthName()函数?

优化枚举转月份名称的实现方案

嘿,很高兴你已经搞定了monthName()的基础实现!确实,针对这种枚举类型转对应字符串的场景,有个更简洁、易维护且高效的优化方案——直接用字符串数组做映射,彻底摆脱繁琐的switch或if分支链。

具体实现代码

先看完整的可运行示例:

#include <stdio.h>

// 定义月份枚举,末尾加MONTH_COUNT方便做边界检查
enum month {
    JAN, FEB, MAR, APR, MAY, JUN,
    JUL, AUG, SEP, OCT, NOV, DEC,
    MONTH_COUNT
};

const char* monthName(enum month m) {
    // 定义与枚举顺序严格对应的月份字符串数组
    static const char* month_names[] = {
        "January", "February", "March",
        "April", "May", "June",
        "July", "August", "September",
        "October", "November", "December"
    };

    // 先做非法输入校验,避免数组越界
    if (m < 0 || m >= MONTH_COUNT) {
        return "Invalid Month";
    }

    // 直接通过枚举值作为索引取字符串,一步到位
    return month_names[m];
}

// 测试示例
int main() {
    enum month aMonth = JAN;
    printf("%s\n", monthName(aMonth)); // 输出 January
    aMonth = DEC;
    printf("%s\n", monthName(aMonth)); // 输出 December
    // 测试非法枚举值
    printf("%s\n", monthName(12)); // 输出 Invalid Month
    return 0;
}

为什么这个方案更优?

  • 代码简洁好维护:后续要修改月份名称、调整枚举顺序,甚至新增枚举值,只需要同步修改字符串数组或枚举定义就行,不用动复杂的分支逻辑,出错概率极低。
  • 性能拉满:直接通过索引访问数组,时间复杂度是O(1),比switch/if链的线性判断高效得多(枚举值越多,优势越明显)。
  • 可读性超强:枚举值和字符串的对应关系一目了然,新人看代码也能快速理解逻辑。

适配特殊枚举定义

如果你的枚举是从1开始定义的(比如JAN = 1),只需要在字符串数组开头加个占位元素即可:

enum month {
    JAN = 1, FEB, MAR, ..., DEC, MONTH_COUNT
};

static const char* month_names[] = {
    "", // 占位,对应枚举值0(非法值)
    "January", "February", ..., "December"
};

这样依然可以用month_names[m]直接获取对应字符串,边界检查逻辑也不用改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:31:20