如果我有一组小字符串值,并且我想获取一个数值来表示它们,那么通过查找表执行此操作的最佳方法是什么?
如果我只是需要直接查找,我知道最佳解决方案只是一系列if语句:
if (strcmp(str, "foo") == 0)
tmp = FOO;
else if (strcmp(str, "bar") == 0)
tmp = BAR;
但是,我问这个是因为这些小字符串值表示我用C编写的小项目中的属性,属性可以是只读或读写(现在不是只写,也许永远不会)
所以我目前所做的只是为了确保工作正常,其中包含一个查找函数,该函数由上面的if-then子句组成,用于查找哪些值是只读的,以及第二个查找哪些值的函数 - 写。但这对我来说很大而且很难看。
我在想,有三个功能。一个函数是lookup函数,它返回一个int值,该值是字符串的数字形式。但是,此查找函数还可以采用一个标志来确定它是获取只读值还是读取写入值。如果对真正只读的值执行写操作,则该函数将返回-EINVAL(或等效的值)。
另外两个函数,现在仍然是读取和写入,只需调用此查找函数,传入一个值的字符串,以及确定它们是用于读取还是写入的标志。
事情是,我不知道这是如何在C中建模的(如果它可以建模),并且搜索谷歌是令人厌烦的所有内容农场剥离这个地方(并给我C ++ / C#答案)。
所以这就是我认为的样子:
int lookup_func(const char *name, const char *flag) {
int tmpval = 0;
/* code to do the lookup. */
if (tmpval == 0)
return -EINVAL;
else
return tmpval;
}
int get_readonly_bit(const char *name) {
return lookup_func(name, "ro");
}
int get_readwrite_bit(const char *name) {
return lookup_func(name, "rw")
}
思考?我们的想法是通过不重复这两个函数的if-then分支来减少代码大小,这两个函数在整体设计上略有不同,只需让某种查找函数找出该值所服务的函数。
答案 0 :(得分:7)
你不考虑只是放一张桌子吗?如果有很多属性,哈希表也可以。
int lookup(const char *name)
{
typedef struct item_t { const char *name; int writable; int value; } item_t;
item_t table[] = {
{ "foo", 0, FOO },
{ "bar", 1, BAR },
{ NULL, 0, 0 }
};
for (item_t *p = table; p->name != NULL; ++p) {
if (strcmp(p->name, prop_name) == 0) {
return p->value;
}
}
return -EINVAL;
}