我打算写一个函数,它应该将错误消息转换为错误代码。 所以我有一系列错误消息
const char *arr_error_message[] =
{
"Critical error",
"Unexpected error",
...
}
和错误代码的枚举:
typedef enum error_code
{
FIRST = 0,
CRITICAL_ERROR = FIRST,
UNEXPECTER_ERROR,
...
LAST,
NOT_FOUND_ERROR
} error_code_t;
,功能将是
error_code_t translate_error_code(const char *err)
{
error_code_t e = FIRST;
do
{
if ( strcmp(arr_error_message[e], err) == 0 ) return e;
} while (++e != LAST);
return NOT_FOUND_ERROR;
}
函数实现的更有效方法是什么,有没有办法(技巧)来实现复杂度为O(1)的函数?
答案 0 :(得分:0)
我认为这只是获得正确数据结构的问题。如果您希望能够从错误代码直接映射到字符串表示,您只需返回存储在相应数组索引中的错误代码:
return arr_error_message[err];
另一方面,如果要从错误消息映射到错误代码,可以考虑使用哈希表。由于您的错误代码集(可能)相对恒定,您可以考虑使用gperf
tool to generate a perfect hash table,这样可以非常快速地将错误消息映射到错误代码。
希望这有帮助!
答案 1 :(得分:0)
如果您计划从错误代码中获取错误字符串,那么一个简单的数组就足以获得O(1)算法。
但是由于您需要来自错误字符串的错误代码,我所知道的最好的方法是使用哈希表来存储和检索节点。使用gnu gperf。
答案 2 :(得分:0)
这只是一个radix tree结构。 C实际上没有字符串,因此所有字符串比较都将是比较单个字符的循环。字符串都是常量。所以你不妨将字符串拆分成复合字符并从中手工构造树,然后一次遍历树一个字符。