【问题标题】:C: Map string to ENUM [duplicate]C:将字符串映射到 ENUM [重复]
【发布时间】:2011-12-27 09:24:40
【问题描述】:

可能重复:
Easy way to use variables of enum types as string in C?

除了手动方式之外,还有什么优雅的方式可以将用户输入的字符串转换为 ENUM 值是直接 C。

调用以 ENUM 作为参数的函数的简化示例:

enum = {MONDAY,TUESDAY,WEDNESDAY};

...

//Get user to enter a day of the week from command line
...

//Set the work day according to user input
if (strcmp(user_input,"MONDAY")==0){
   SET_WORK_DAY(MONDAY);
} else if (strcmp(user_input,"TUESDAY")==0){
  SET_WORK_DAY(TUESDAY);
}
...

谢谢

【问题讨论】:

  • 我认为您的意思是 strcmp 而不是 strcpy
  • @bobbymcr 这不是骗子;这个问题很相似,但它是相反的(字符串到枚举 inst of enum to string)。
  • Easy way to use variables of enum types as string in C? 用于获取 ENUM 的名称,使用 ENUM 值作为输入。我需要使用 ENUM 名称作为输入来获取 ENUM 值。
  • @cnicutar 是的,抱歉,修改了问题以反映这一点

标签: c


【解决方案1】:
$ cat wd.c
#include <stdio.h>

#define mklist(f) \
    f(MONDAY) f(TUESDAY) f(WEDNESDAY)

#define f_enum(x) x,
#define f_arr(x) {x, #x},

enum weekdays { mklist(f_enum) WD_NUM };

struct { enum weekdays wd; char * str; } wdarr[] = { mklist(f_arr) };

int main(int argc, char* argv[]) {
    int i;
    for (i=0; i < sizeof(wdarr)/sizeof(wdarr[0]); i++) {
        if (strcmp(argv[1], wdarr[i].str) == 0) {
            printf("%d %s\n", wdarr[i].wd, wdarr[i].str);
            return 0;
        }
    }
    printf("not found\n");
    return 1;
}
$ make wd
cc     wd.c   -o wd
$ ./wd MONDAY
0 MONDAY
$ ./wd TUESDAY
1 TUESDAY
$ ./wd FOODAY
not found

是我最喜欢做这些事情的方式。这样可以确保enum 和映射数组之间不会出现一致性错误。

【讨论】:

【解决方案2】:

不,没有别的办法;因为在机器内部,enum 只是一些数字。您可以使用一些预处理器技巧。见this question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2019-01-13
    • 2019-09-11
    • 2012-01-23
    • 2018-08-01
    • 2012-08-21
    相关资源
    最近更新 更多