strstr和匹配的匹配项

时间:2010-04-27 21:16:57

标签: c strstr

我可以使用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语句,这样做的好方法是什么?

6 个答案:

答案 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]);
}