字符串比较的更好方法
better way for string comparison
我有一个 JSON 解析器,它为每个解析的键值对发送回调。然后我在我的程序中使用 strncmp
和静态分配的字符串来检查该字段是否匹配我感兴趣的任何字段。我现在已经在 if-else
中得到了十几个 strncmp
陈述:
if (strncmp(input, "apple", sizeof("apple")-1) == 0)
{// do something}
else if (strncmp(input, "banana", sizeof("banana")-1) == 0)
{// do something}
我不确定这是否是完成工作的 optimal/maintainable 方式。有更好的方法吗?我已经在编译时预先计算了字符串长度。
取决于你的集合的大小。对于大量的长模式,您的 O(MN) 查找肯定不是最优的。
您可以将它们存储在哈希集(平均 O(M))或 trie 中。如果您从 Delphic Oracle 中获得了一组真正固定的模式,并且首字母或多或少均匀地分布在模式中,您甚至可以自己进行硬编码:
switch(input[0]) {
case 'a': // check that it's an "apple"
break;
}
您可以定义一个静态字符串数组:
const char *field_names[] = {
"apple",
"banana",
NULL
};
然后遍历数组,查看字符串是否与数组元素匹配:
for (int i = 0; field_names[i] != NULL; i++) {
if (!strcmp(input, field_names[i]))
// Do things
}
如果您需要限制比较的大小,您可以将名称字符串 + 大小组合成一个数组结构。
如果您需要对每个操作执行不同的操作,您可以在结构中包含一个函数指针以指示要执行的操作。
我有一个 JSON 解析器,它为每个解析的键值对发送回调。然后我在我的程序中使用 strncmp
和静态分配的字符串来检查该字段是否匹配我感兴趣的任何字段。我现在已经在 if-else
中得到了十几个 strncmp
陈述:
if (strncmp(input, "apple", sizeof("apple")-1) == 0)
{// do something}
else if (strncmp(input, "banana", sizeof("banana")-1) == 0)
{// do something}
我不确定这是否是完成工作的 optimal/maintainable 方式。有更好的方法吗?我已经在编译时预先计算了字符串长度。
取决于你的集合的大小。对于大量的长模式,您的 O(MN) 查找肯定不是最优的。
您可以将它们存储在哈希集(平均 O(M))或 trie 中。如果您从 Delphic Oracle 中获得了一组真正固定的模式,并且首字母或多或少均匀地分布在模式中,您甚至可以自己进行硬编码:
switch(input[0]) {
case 'a': // check that it's an "apple"
break;
}
您可以定义一个静态字符串数组:
const char *field_names[] = {
"apple",
"banana",
NULL
};
然后遍历数组,查看字符串是否与数组元素匹配:
for (int i = 0; field_names[i] != NULL; i++) {
if (!strcmp(input, field_names[i]))
// Do things
}
如果您需要限制比较的大小,您可以将名称字符串 + 大小组合成一个数组结构。
如果您需要对每个操作执行不同的操作,您可以在结构中包含一个函数指针以指示要执行的操作。