2015-11-29 48 views
1

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

#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中,有没有办法将一个字符串转换为枚举数?

+0

[C:地图串ENUM]的可能的复制(HTTP: //sketoverflow.com/questions/8642970/c-map-string-to-enum) –

+0

什么是“前任”?顺便说一下,预处理器不会执行这样的转换,因为这不是它的任务,并且处理器(CPU)不会执行这样的转换,因为枚举中使用的符号不会出现在可执行文件中,除非作为调试符号。 – MikeCAT

+0

[在C中使用枚举类型的变量作为字符串的简单方法]可能的重复(http://stackoverflow.com/questions/147267/easy-way-to-use-variables-of-enum-types-as-字符串在-c)的 – MikeCAT

回答

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" }(例如)或其他不属于区分大小写,但或多或​​少总是以相同的方式。

有的还创建一个字符串数组,他们与枚举值指标,但我不喜欢这样做(枚举并不总是连续的)