C中的结构数组索引

问题描述 投票:1回答:1

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

例如:

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 arrays enums
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.