今天可能是基本的。
我有一个输入作为const char *,我想将它与const char *的许多选项进行比较。像我在下面写的那样。
str_equal - 将其视为const char *的比较函数。 ' STR'是输入const char *。
所以,写得像这样:
bool function1(const char* str) {
if (str_equal(str, "abc")) {
// Do for abc
} else if (str_equal(str, "def")) {
// Do for def
} else if (str_equal(str, "ghi")) {
// Do for ghi
} ...
...
}
想知道实现这一目标的其他可行方法是什么。如你所见,它看起来很丑陋。
答案 0 :(得分:5)
我会使用一组结构:
static bool do_abc(void)
{
// ...
}
bool dispatch(const char *str)
{
static const struct {
const char *key;
bool (*func)(void);
} funcs[] = {
{ "abc", do_abc },
{ "def", do_def },
{ "ghi", do_ghi },
};
for (size_t i = 0; i < sizeof funcs / sizeof *funcs; ++i)
{
if(strcmp(funcs[i].text, str) == 0)
return funcs[i].func();
}
return false;
}
这假设所有函数都具有相同的签名,否则很难概括。
顺便说一句,这可以称为“数据驱动代码”的一个例子,这通常很好。
答案 1 :(得分:1)
取决于您的需求,您可以使用其他几种方式。
例如,您最初创建一个排序的字符串数组,您可以将其与之进行比较并使用二进制搜索:https://linux.die.net/man/3/bsearch。
你也可以使用哈希表或树,只是有点复杂。
在某些情况下,您甚至可能会创建一个包含所有字符串的组合字符串,例如&#34; abcdefdhi&#34;并使用strstr
在单一操作中查找字符串。