startsWith(str_a, str_b)
標準 C ライブラリのようなものはありますか?
nullbytes で終わる 2 つの文字列へのポインターを取得し、最初の文字列が 2 番目の文字列の先頭にも完全に表示されるかどうかを教えてくれます。
例:
"abc", "abcdef" -> true
"abcdef", "abc" -> false
"abd", "abdcef" -> true
"abc", "abc" -> true
startsWith(str_a, str_b)
標準 C ライブラリのようなものはありますか?
nullbytes で終わる 2 つの文字列へのポインターを取得し、最初の文字列が 2 番目の文字列の先頭にも完全に表示されるかどうかを教えてくれます。
例:
"abc", "abcdef" -> true
"abcdef", "abc" -> false
"abd", "abdcef" -> true
"abc", "abc" -> true
これには標準関数はありませんが、定義できます
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
から が指す配列までの文字を比較します (ヌル文字に続く文字は比較されません) 。"s1
s2
どうやらこれには標準の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
)。wj32やChristoph のようなソリューションは、より優れたパフォーマンスを提供する可能性があります (ただし、ベクトル化に関するこのコメントは私の C の知識を超えています)。また、 onを回避するFred Foo のソリューションにも注意してください (彼の言う通り、代わりにを使用する場合は不要です)。(非常に)大きな文字列またはタイトなループで繰り返し使用する場合にのみ重要ですが、重要な場合は重要です。strlen
str
strncmp
memcmp
私はおそらく を使用しstrncmp()
ますが、楽しみのために生の実装を使用します。
_Bool starts_with(const char *restrict string, const char *restrict prefix)
{
while(*prefix)
{
if(*prefix++ != *string++)
return 0;
}
return 1;
}
関数を使用strstr()
します。 Stra == strstr(stra, strb)
私はエレガントなコードを書く専門家ではありませんが...
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;
}