C:将字符串映射到ENUM

可能重复:
在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); } ... 

谢谢

 $ cat wd.c #include  #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和映射数组之间不会发生一致性错误。

不,没有其他办法; 因为enum是在机器内部,只是一些数字。 你可以使用一些预处理器技巧。 看到这个问题 。