所以我第一次尝试在C中使用枚举类型。所以我有一个Enumerated"变量?"声明,我也有一个结构,其中包含一个Enumerated类型的变量(以及其他内容)。最后我有一个静态数组,其中有一个元素包含每个枚举"类型?"他们被宣布的顺序相同。我希望使用枚举类型作为数组的索引。
所以我的问题是我需要以某种方式将char *变量与枚举类型相关联。如果我知道Char *变量是枚举类型之一,有没有办法断言,而不必查看每个char来确定哪个特定的枚举"选项"是吗?
示例:
enum example = {abc,def}
struct _strExample {
enum example letters;
....
};
typedef struct _strExample strEx;
static strEx Table[2] = {
{abc,...}
{def,...}
};
//Given char* "abc" , want either example.abc or 0 ( correct index of table)
所以给定char *" abc"(不需要是char *),是否有一种简单的方法可以获得正确的枚举"类型?"(abc或def)或表的正确索引?我知道我可以检查char *中的所有单个字符并手动确定哪个枚举"类型?"它是,但我将使用一大堆枚举变量,这种事情正是我试图避免的。任何有关枚举类型和/或我的设计的帮助或建议都将非常受欢迎。
答案 0 :(得分:5)
使用一个字符串数组,其中数组的索引是枚举值。如果字符串都很短,或者所有字符串长度相同,则将字符串存储在数组中是有意义的。否则,请使用char *指针。
typedef enum enum_t { plugh, plover, xyzzy, y0 } enum_t;
const char *etable = { "plugh", "plover", "xyxxy", "y0", NULL };
有了这个,你可以通过简单的搜索转换,如:
enum_t find_enum(char *sval)
{
enum_t result=plugh; /* value corresponding to etable[0] */
int i=0;
for (i=0; etable[i]!=NULL; ++i, ++result)
if (0==strcmp(sval, etable[i])) return result;
return -1;
}
枚举到字符串的转换只是etable[e-plugh]
。那些允许enum_t
的不同定义,其中第一个有意义的值可能不是0,但之后按顺序分配值。
答案 1 :(得分:1)
不,您无法从字符数组中查找任何标量值。您必须迭代一组字符串进行比较,并找到与枚举成员的关系。
您可以使用结构数组
typedef struct { int value; const char * name; } lookup_t;
lookup_t lookup[] = {
{ 1, "One"},
{ 0, NULL} // end tag, alternatively use the _countof(lookup) to get the number of elements
};
并将您的char*
与name
成员进行比较。然后在匹配时使用value
。
答案 2 :(得分:0)
使用if:
char *ex = "abc";
strEx strex;
if(!(strcmp("abc",ex))) {
strex.letters = abc;
}
else {
strex.letters = def;
}