0

strstr を使用して 2 つの異なる文字列を 1 行で検索しようとしています。

sBuffer = "This is app test"
s1= strstr (sBuffer, "This");
s2= strstr (sBuffer, "test");
printf("%s\n", s1); //prints - This is app test 
printf("%s\n", s2); //prints - test
if (s1 && s2)
    //do something

s1 の予期される出力は文字列である必要があります"This"が、s1 の文字列全体が出力されています。

ただし、s2 は正しく印刷されます。

どんな助けでも感謝します。

編集:すべての回答は正しいですが(すべての回答に賛成)、dasblinkenlightの回答を受け入れています。これは、以下に示すようにブール条件をチェックするだけで十分であることがわかっているためです。すべての答えをありがとう。

if ( (strstr (sBuffer, "This")) && (strstr (sBuffer, "test")) )
        //do something
4

3 に答える 3

4

関数が何をするのか理解していません。

sBuffer検索文字列 (「針」) が見つかった (「干し草の山」)内のアドレスが表示されます。haystack 文字列は変更されないため、部分文字列は終了しません。

あなたが持っている:

         +---+---+---+---+---+---+---+--+---+---+---+---+---+---+---+---+----+
sBuffer: | T | h | i | s |   | i | s |  | a | p | p |   | t | e | s | t | \0 |
         +---+---+---+---+---+---+---+--+---+---+---+---+---+---+---+---+----+
           ^                                              ^
           |                                              |
           |                                              |
  strstr(sBuffer, "Test")                        strstr(sBuffer, "test")

ご覧のとおり、strstr(sBuffer, "Test")は単純に を返しsBufferます。もちろん残りの文字はまだ含まれていますが、これは同じメモリ バッファです。

見つかった部分文字列を抽出する必要がある場合は、自分で行う必要があります。使用するのに適した関数は、それがあるstrlcpy()場合です。それ以外の場合はstrncpy()、コピーするデータの正確な長さがわかっているため機能します。

于 2013-06-03T10:23:01.340 に答える
1

strstr()見つかった部分文字列の最初の文字へのポインターを返します。検索された部分文字列の後の文字列は NUL で終了しません。これは予期された正しい動作です。

解決策については、非const文字列がある場合は、正しい位置で NUL で終了するように単純に変更できます (ただし、行った変更には注意してください)。そうでない場合は、部分文字列のコピーを作成します。

const char *haystack = "abcd efgh ijkl";
const char *needle   = "efgh";

const char *p = strstr(haystack, needle);
if (p) {
    size_t l = strlen(needle);
    char buf[l + 1];
    memcpy(buf, p, l);
    buf[l] = 0;
    printf("%s\n", buf);
}
于 2013-06-03T10:23:31.000 に答える
1

の戻り値はstrstr、一致した時点の元の変更されていない文字列へのポインターです。2 番目の呼び出しが表示される理由testは偶然ですtest。検索された文字列の末尾にあるだけです。sBufferだった場合"This is app test of strstr"、2 番目の呼び出しの出力は、test of strstr単に ではなく になりますtest

これを修正するには、プログラムを次のように変更します。

printf("%s\n", s1 ? "This" : "");
printf("%s\n", s2 ? "test" : "");

これが機能する理由は、strstrnull 以外のポインターを返す唯一のケースは、探していたものと完全に一致するものが見つかった場合であることがわかっているためです。ブール値の「見つかった/見つからなかった」フラグだけが必要な場合は、s1s2forを簡単にテストできますNULL。このトリックは、最終的なifステートメントですでに使用されています。

于 2013-06-03T10:23:43.440 に答える