C:将字符串映射到ENUM

squ*_*ter 7 c

可能重复:
在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);
}
...
Run Code Online (Sandbox Code Playgroud)

谢谢

glg*_*lgl 17

$ 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
Run Code Online (Sandbox Code Playgroud)

是我最喜欢做这种事情的方式.这可确保enum在映射数组之间不会发生一致性错误.

  • +1表示简单的解决方案.有关将不可读的宏内容隐藏到应用程序程序员的更通用的解决方案,请参阅http://p99.gforge.inria.fr/p99-html/group__types.html (3认同)