-1

我有一个 JSON 解析器,它为每个解析的键值对发送回调。然后strncmp我在我的程序中使用静态分配的字符串来检查该字段是否与我感兴趣的任何字段匹配。我现在得到了十几个strncmpinif-else语句:

if (strncmp(input, "apple", sizeof("apple")-1) == 0) 
    {// do something}
else if (strncmp(input, "banana", sizeof("banana")-1) == 0) 
    {// do something}

我不确定这是否是完成工作的最佳/可维护方式。有更好的方法吗?我已经在编译时预先计算了字符串长度。

4

2 回答 2

1

您可以定义一个静态字符串数组:

const char *field_names[] = {
    "apple",
    "banana",
    NULL
};

然后遍历数组,查看字符串是否与数组元素中的一个匹配:

for (int i = 0; field_names[i] != NULL; i++) {
    if (!strcmp(input, field_names[i]))
        // Do things
}

如果您需要限制比较的大小,您可以有一个数组 a 结构组合名称字符串 + 大小。

如果您需要为每个操作执行不同的操作,您可以在结构中包含一个函数指针来指示要做什么。

于 2020-05-09T17:23:37.367 回答
0

取决于你的集合的大小。对于大量长模式,您的 O(MN) 查找肯定不是最佳的。

您可以将它们存储在散列集(平均为 O(M))或 trie 中。如果您从 Delphic Oracle 获得了一组非常固定的模式,并且首字母在模式之间或多或少均匀分布,您甚至可以自己硬编码:

switch(input[0]) {
case 'a': // check that it's an "apple"
          break;
}
于 2020-05-09T17:18:36.347 回答