1

でテストする可能性のあるオカレンスがいくつかあり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ステートメントを使用せずにこれを行う良い方法は何でしょうか?

4

6 に答える 6

2

あなたの例は単純化しすぎているように感じますが、単純化できることに注意してください。"FOO"文字列が見つからない場合は、文字列が"FOO2"見つからないことがわかっているので、例の最初の 2 つのケースを除くすべてを排除できます。

于 2010-04-27T22:16:08.347 に答える
2

コンマ演算子を使用しますか:

if ((lookfor = "FOO", a = strstr(string, lookfor)) != NULL ||
    (lookfor = "BAR", a = strstr(string, lookfor)) != NULL ||
    ...)
{
    var = strlen(lookfor);
}

コンマ演算子を使用すると、左から右の順序で複数の式を評価できます。全体としての式の値は、右端の esub-expression の値です。

于 2010-04-27T21:20:53.090 に答える
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 は非常に重要な点を指摘しています。最初に前者を見つけること。」これを反映するように編集しました。この関数の使用方法によっては、実行時に並べ替えが行われる場合もあります。

于 2010-04-27T21:25:09.303 に答える
1

件名文字列で検索するパターンがたくさんある場合は、 Aho-Corasickアルゴリズムが最適です。

于 2010-04-27T21:47:55.917 に答える
0

この方法で検索する必要がある多数のさまざまな文字列セットがある場合は、おそらく正規表現ライブラリを使用して、一致するように DFA をコンパイルする必要があります(FOO|FOO2|FOO3|...)。これが最適なソリューションです。特に検索する文字列が一定であり、それらを効率的にハードコーディングできる場合は、ツリー構造を作成して同じ結果を自分で実装することもできます。

于 2010-09-20T04:08:06.130 に答える
-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]);
}
于 2010-04-27T22:13:48.120 に答える