我可以使用strstr
进行多次测试。
if ((a = strstr(string, "FOO")) != NULL || (a = strstr(string, "BAR")) != NULL ||
(a = strstr(string, "FOO2")) != NULL ||(a = strstr(string, "BAR2")) != NULL ||
(a = strstr(string, "FOO3")) != NULL ||(a = strstr(string, "BAR3")) != NULL) // do something
然后根据发现我需要做的事件
var = strlen("THE_ONE_MATCHED_ABOVE");
如果不使用大量if语句,这样做的好方法是什么?
答案 0 :(得分:2)
您是否愿意使用逗号运算符:
if ((lookfor = "FOO", a = strstr(string, lookfor)) != NULL ||
(lookfor = "BAR", a = strstr(string, lookfor)) != NULL ||
...)
{
var = strlen(lookfor);
}
逗号运算符允许您按从左到右的顺序计算多个表达式。表达式的整体值是最右边的esub表达式的值。
答案 1 :(得分:2)
int match_length( const char* string) {
/* return 0 if no match, otherwise strlen of match */
static const char* const MATCHES[] = { "BAR2", "FOO2", "FOO3", "FOO", "BAR", "..." } ;
// NB: MATCHES must be sorted in descending order of length (longest first).
const char* r = 0;
int i = 0 ;
for( ;
i < sizeof(MATCHES) / sizeof(MATCHES[0])
&& ( r = strstr( string, MATCHES[i] ) ) == 0;
++i );
return r ? strlen( MATCHES[i] ) : 0 ;
}
注意:caf非常重要:“你需要按降序长度顺序排列MATCHES - 如果strstr(x,”FOO2“)非空,那么strstr(x,”FOO“)也是如此,所以你需要先找到前者。“我编辑反映了这一点。根据此功能的用途,也可以在运行时完成排序。
答案 2 :(得分:2)
我觉得你的例子过于简单,但值得注意的是它可以简化。如果找不到字符串"FOO"
,那么您就知道找不到字符串"FOO2"
,因此您可以消除示例中除前两种情况之外的所有情况。
答案 3 :(得分:1)
如果要在主题字符串中查找大量模式,最好的选择是Aho-Corasick algorithm:
答案 4 :(得分:0)
如果您需要以这种方式搜索大量不同的字符串,则应该使用正则表达式库并编译DFA以匹配(FOO|FOO2|FOO3|...)
。这是最佳解决方案。你也可以计算树结构来自己实现相同的结果,特别是如果要搜索的字符串是常量的,你可以有效地对它们进行硬编码。
答案 5 :(得分:-1)
如果在代码中频繁使用该模式,则应编写一个小辅助函数,如下所示:
int FindFirstMatch(const char* stringItem, const char** stringList)
{
int index = -1;
int itemLength = strlen(stringItem);
if (stringList == NULL)
{
return index;
}
for (; stringList[index] != NULL; index++)
{
if ( (strlen(stringList[index]) == itemLength)
&& (strstr(stringList[index], stringItem) != NULL))
{
break;
}
}
return index;
}
该函数将一个字符串和一个NULL
终止的字符串数组作为参数,并返回列表中第一个出现的索引。然后,您可以使用索引来检查字符串长度。
要像在示例中那样进行检查,请改写:
const char* itemList[] = {"FOO", "FOO2", "FOO3", "BAR", "BAR2", "BAR3", NULL};
int itemLength = 0;
int index = FindFirstMatch("BAR3", itemList);
if (index != -1)
{
itemLength = strlen(itemList[index]);
}