我想将字符串转换为枚举数字。下面的代码是我想要做的。
#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 :(得分: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" }
(例如)或其他不区分大小写的情况,但或多或少总是以相同的方式重复。
有些人还会创建一个字符串数组,并使用枚举值进行索引,但我不喜欢这种方式(枚举并不总是连续的)