99

startsWith(str_a, str_b)標準 C ライブラリのようなものはありますか?

nullbytes で終わる 2 つの文字列へのポインターを取得し、最初の文字列が 2 番目の文字列の先頭にも完全に表示されるかどうかを教えてくれます。

例:

"abc", "abcdef" -> true
"abcdef", "abc" -> false
"abd", "abdcef" -> true
"abc", "abc"    -> true
4

9 に答える 9

189

これには標準関数はありませんが、定義できます

bool prefix(const char *pre, const char *str)
{
    return strncmp(pre, str, strlen(pre)) == 0;
}

C 標準 (7.21.4.4/2) によると、strより短いことを心配する必要はありません。pre

このstrncmp関数は、 が指す配列nから が指す配列までの文字を比較します (ヌル文字に続く文字は比較されません) 。"s1s2

于 2011-01-22T22:17:09.217 に答える
88

どうやらこれには標準のC関数はありません。そう:

bool startsWith(const char *pre, const char *str)
{
    size_t lenpre = strlen(pre),
           lenstr = strlen(str);
    return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0;
}

上記は素晴らしく明確ですが、タイトなループで実行している場合、または非常に大きな文字列で作業している場合は、両方の文字列の全長を前もってスキャンするため、最高のパフォーマンスが得られないことに注意してください ( strlen)。wj32Christoph のようなソリューションは、より優れたパフォーマンスを提供する可能性があります (ただし、ベクトル化に関するこのコメントは私の C の知識を超えています)。また、 onを回避するFred Foo のソリューションにも注意してください (彼の言う通り、代わりにを使用する場合は不要です)。(非常に)大きな文字列またはタイトなループで繰り返し使用する場合にのみ重要ですが、重要な場合は重要です。strlenstrstrncmpmemcmp

于 2011-01-22T22:26:26.420 に答える
36

私はおそらく を使用しstrncmp()ますが、楽しみのために生の実装を使用します。

_Bool starts_with(const char *restrict string, const char *restrict prefix)
{
    while(*prefix)
    {
        if(*prefix++ != *string++)
            return 0;
    }

    return 1;
}
于 2011-01-22T23:45:15.327 に答える
6

関数を使用strstr()します。 Stra == strstr(stra, strb)

于 2011-01-22T22:30:53.973 に答える
5

私はエレガントなコードを書く専門家ではありませんが...

int prefix(const char *pre, const char *str)
{
    char cp;
    char cs;

    if (!*pre)
        return 1;

    while ((cp = *pre++) && (cs = *str++))
    {
        if (cp != cs)
            return 0;
    }

    if (!cs)
        return 0;

    return 1;
}
于 2011-01-22T22:30:43.260 に答える