如果我有一组小字符串值,并且我想获取一个数值来表示它们,那么通过查找表执行此操作的最佳方法是什么?
如果我只需要直接查找,我知道最佳解决方案只是一系列if语句:
if (strcmp(str, "foo") == 0)
tmp = FOO;
else if (strcmp(str, "bar") == 0)
tmp = BAR;
Run Code Online (Sandbox Code Playgroud)
但是,我问这个因为这些小字符串值表示我用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")
}
Run Code Online (Sandbox Code Playgroud)
思考?这个想法是通过不重复这两个函数的if-then分支来减少代码大小,这两个函数在整体设计上略有不同,只是让某种查找函数找出这个值所服务的函数.
你不考虑把桌子放进去吗?如果有很多属性,哈希表也可以.
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;
}Run Code Online (Sandbox Code Playgroud)