如何将字符串转换为枚举数?

时间:2015-11-29 13:19:37

标签: c macros

我想将字符串转换为枚举数字。下面的代码是我想要做的。

#define SELECT_DAY(s) s

enum sched {MON, TUE, WED};
int main(void)
{
    char *str = "TUE";

    printf("%d\n", SELECT_DAY(str));
    return 0;
}

你可以看到,str有“TUE”字符串的指针。所以,我认为printf函数会输出数字1.但是,它打印出字符串的地址。

printf("%d\n", TUE);

上面的代码是我的预期。前辈能不能处理这个操作? 我知道在C#中将字符串转换为枚举的方法是可行的。在C中,有没有办法将字符串转换为枚举数?

1 个答案:

答案 0 :(得分:1)

嗯,在C世界,这是DIY。

没有'明显'的方法,通常人们使用类似的东西:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

enum sched {MON, TUE, WED};

static const struct {
    enum sched val;
    const char *const str;
} enum_2_string_map[] = {
    { MON, "MON" },
    { TUE, "TUE" },
    { WED, "WED" }
};

enum sched string2enum(const char *str)
{
    int i;
    for (i = 0; i < sizeof(enum_2_string_map) / sizeof(*enum_2_string_map); i++) {
        if (strcmp(str, enum_2_string_map[i].str) == 0) {
            return enum_2_string_map[i].val;
        }
    }
    /* you need to decide what to do if string is not found; assert or return a
     * default value... you choose */
    abort();
}

#define SELECT_DAY(s) string2enum(s)

int main(void)
{
    char *str = "TUE";

    printf("%d\n", SELECT_DAY(str));
    return 0;
}

您可能会看到使用宏来实现,以防止重复{ MON, "MON" }(例如)或其他不区分大小写的情况,但或多或​​少总是以相同的方式重复。

有些人还会创建一个字符串数组,并使用枚举值进行索引,但我不喜欢这种方式(枚举并不总是连续的)