【问题标题】:Comparing Char* to Enum variable in C将 Char* 与 C 中的 Enum 变量进行比较
【发布时间】:2015-03-27 14:18:37
【问题描述】:

所以我第一次尝试在 C 中使用枚举类型。所以我有一个枚举“变量”?声明,我也有一个结构,它有一个枚举类型的变量(除其他外)。最后我有一个静态数组,其中有一个包含每个枚举“类型?”的元素。以它们被宣布的相同顺序。我希望使用枚举类型作为数组的索引。

所以我的问题是我需要以某种方式将 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* 中的所有单个字符并手动确定哪个枚举“类型?”是的,但我将使用大量枚举变量,而这种事情正是我试图避免的。你们可以就枚举类型和/或我的设计提供任何帮助或建议将不胜感激。

【问题讨论】:

  • 您是否考虑过使用gperf?
  • 不,enum 值必须计算为编译时已知的整数值,因此字符串(即使指针将转换为整数)不可用。不过,您可以使用单个字符,因为 char 是一个整数类型。
  • 我在 java 中使用过一些哈希表,这似乎是一个很好的解决方案,但我可能只使用 C 标准库中的东西。
  • 最后一段的解决方法是怎么回事?如果您害怕性能损失,请将查找函数内联,声明表const,编译器应该能够优化字符串文字的查找(Gcc 可以,我刚刚尝试过)。
  • 您可以遍历 strEx 数组,其中包含枚举和可能的 char *(但我不知道,显示的代码不完整)。要从枚举到字符串,您可以再次遍历 strEx 直到找到它。不,您不能直接迭代枚举(有一些解决方法)。

标签: c enums


【解决方案1】:

使用一个字符串数组,其中数组的索引是枚举值。如果字符串都很短,或者长度都差不多,那么将字符串存储在数组中是有意义的。否则,使用 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,但随后会按顺序分配这些值。

【讨论】:

  • 很好的解决方案。但是您有一个小错字:etable 应该是 char *etable[]。此外,如果没有 typedef,则类型必须是 C 中的 enum enum_t,并带有 enum 关键字..
  • 这似乎是最好的解决方案,与我的示例相关,我想我只是要在我的结构中添加一个 char * 变量。所以表将是静态 strEx Table[2] = { {{abc"abc",...} {def,"def",...} };感谢您的帮助
  • 对此答案的补充:X macros 可能是保持枚举和数组同步的好方法,如果您不介意宏语法(或根本不使用宏)。
  • @MOehm 感谢您的更正。我终于开始添加它们了。 X 宏链接很有趣。早在 1986 年,我就“发明”了一些与该技术非常相似的东西(将长的多行 #define 替换为相同行的 #include。
【解决方案2】:

不,您不能从字符数组中查找任何标量值。您必须遍历一组字符串来比较并找到与枚举成员的关系。

你可以使用结构数组

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。

【讨论】:

    【解决方案3】:

    使用如果:

    char *ex = "abc";
    strEx strex;
    if(!(strcmp("abc",ex))) {
        strex.letters = abc;
    }
    else {
        strex.letters = def;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2012-05-03
      • 2013-12-21
      • 2012-05-19
      • 2015-03-23
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多