更好的字符串比较方法

问题描述 投票:-1回答:1

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

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

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

c string strncmp
1个回答
0
投票

你可以定义一个静态字符串的数组。

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

然后在数组中循环,检查字符串是否与数组中的元素匹配。

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

如果你需要限制比较的大小 你可以用一个数组将字符串名称+大小结合起来

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


1
投票

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

你可以将它们存储在一个哈希集中(平均O(M)),或者存储在一个Trie中。你甚至可以自己硬编码一个,如果你从Delphic Oracle中得到了一套真正固定的模式,并且首字母在模式中分布得差不多均匀的话。

switch(input[0]) {
case 'a': // check that it's an "apple"
          break;
}
© www.soinside.com 2019 - 2024. All rights reserved.