比较许多const char *和一个const char *

时间:2018-04-06 10:32:06

标签: c

今天可能是基本的。

我有一个输入作为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
  } ...
  ...
}

想知道实现这一目标的其他可行方法是什么。如你所见,它看起来很丑陋。

2 个答案:

答案 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在单一操作中查找字符串。