c - C中的结构数组索引

标签 c arrays enums

我想以这种方式定义结构数组,以便可以轻松执行搜索操作并可以使用枚举值检索字符串。

例如:

enum MY_ENUM { 
    MY_ENUM_VAL = 0,
    MY_ENUM_VAL_8 = 8,
    MY_ENUM_VAL_50 = 50,
    MY_ENUM_VAL_200 = 200,
    MY_ENUM_VAL_565 = 565,
};

struct my_struct {
    int val;
    char *str;
};


/* Struct array */
struct my_struct my_struct_array[] = {
    { MY_ENUM_VAL,  "str0" },
    { MY_ENUM_VAL_8, "str8" },
    { MY_ENUM_VAL_50, "str50" },
    { MY_ENUM_VAL200, "str200" },
    { MY_ENUM_VAL_565, "str565" },
};

这样定义数组的优点是我可以进行搜索操作,而且如果我在数组中找不到任何值,那么我可以分配一些默认值。但是,如果我想使用像

这样的枚举值来查找一些字符串怎么办?
char *str50 = my_struct_array[MY_ENUM_VAL50].str; // this won't work.

如果我像下面这样基于枚举值进行索引,那么我将无法进行搜索操作。另外,如果我有一些像 300 这样的随机值,我可能会得到一些垃圾值。

/* String array */
const char *my_string_array[] = {
    [MY_ENUM_VAL] = "str0",
    [MY_ENUM_VAL_8] = "str8",
    [MY_ENUM_VAL_50] = "str50",
    [MY_ENUM_VAL200] = "str200",
    [MY_ENUM_VAL_565] = "str565",
};

定义数组的最佳/最优方法是什么才能实现上述两个操作?

最佳答案

快速搜索不是一项微不足道的操作。 C 语言没有提供简单的方法来处理(键,值)映射,例如 C++ 中的 std::mapstd::unordered_map 或 Python 中的 dict。您只能使用标准库中的函数。 C99 定义了 bsearch 允许在排序的数组中进行二分法搜索,Posix 定义了 lsearch(线性搜索)和 hsearch(直接使用 key hash 访问).或者在普通的单个 C 中,扫描数组以查找您的 key 。

关于c - C中的结构数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47839500/

相关文章:

arrays - 如何在 Vuex Store 中管理嵌套数组并通过组件传递它

ruby-on-rails - 我应该如何测试 Rails 枚举?

python - 是否可以使用 python 模拟 C 函数?

c - printk的输出未显示

java - 在 for 循环和数组 printint 之间切换。 java

mysql - 如何识别和取消选择具有枚举数据类型的列的仅一个字符?

C编程问题无关变量在使用STRCPY后被覆盖

c - 是否可以为数组名称分配一个新值?

c - 从C中同一目录中的另一个文件调用函数

python - 如何使用 numpy 将一个小矩阵添加到一个大矩阵中?