【问题标题】:Check if character is in enum in C检查字符是否在 C 的枚举中
【发布时间】:2021-01-22 00:11:51
【问题描述】:

假设我需要从键盘读取一个字符,然后在当前菜单部分检查该字符是否有效(具有某些功能)。 因此,如果我在 firstMenu 中,搜索 firstMenuKeys 项,如果找到该字符,则调用某个函数,否则抛出该字符。 也许 Enum 不适合这个目的。

enum firstMenuKeys {

    UP = 72, 
    DOWN = 80,
    LEFT = 75, 
    RIGHT = 77,
    ENTER = 101,
    
};

enum secondMenuKeys {

    UP = 72, 
    DOWN = 80,
    ENTER = 101,
    
};




int main() {


    char c;
    c = getch();

    
    //check whether c is in firstMenuKeys


}

【问题讨论】:

  • enum 不直接相关。您可能需要一个包含有效值的数组(可能来自enum)并且您需要搜索该数组。或者,您可以使用 switchenum 名称作为案例标签,并使用 default 案例来捕获无效的案例。
  • 请注意,在 C 中,枚举常量在范围内必须是不同的——请参阅 C11 §6.7.2.2 Enumeration specifiers §3 and footnote 127。您的 C 代码无法编译。您可能想要创建键名的枚举,以及数组firstMenuKeyssecondMenuKeys
  • 枚举本质上是符号定义的集合,没有枚举或检查成员资格的机制。由于这些似乎都是字符值,因此一种方法是将它们存储在字符串 const char firstKeys[] = "HPKMe"; 中,然后检查 strchr(firstKeys, c) 是否匹配。

标签: c enums character


【解决方案1】:

enum 本身并不适合根据一组有效值检查值 - C 没有指定迭代枚举值的操作。一种常见的方法是使用X-macro 来创建枚举和相应的检查函数。使用 X 宏允许列表值定义一次,然后在多个上下文中使用。

#define FIRST_MENU_KEYS \
    X(UP, 72) \ 
    X(DOWN, 80) \
    X(LEFT, 75) \ 
    X(RIGHT, 77) \
    X(ENTER, 101)

#define X(a, b) a = b,
enum firstMenuKeys {
    FIRST_MENU_KEYS
};

#define X(a, b) case a:
int isFirstMenuKey(char input)
{
    switch (input) {
        FIRST_MENU_KEYS
            return 1;
        default:
            return 0;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2013-03-12
    • 2012-06-03
    相关资源
    最近更新 更多