私が使用しているデシリアライゼーション ライブラリ (messagepack) は、null で終わる文字列を提供しません。代わりに、文字列の先頭へのポインターと長さを取得します。この文字列を通常の null で終わる文字列と比較する最速の方法は何ですか?
2610 次
3 に答える
2
最も速い方法はstrncmp()
、比較する長さを制限する方法です。
if (strncmp(sa, sb, length)==0)
...
ただし、これは、使用する長さが 2 つの文字列の最大長であることを前提としています。null で終了する文字列の長さがこれより長くなる可能性がある場合は、最初に長さを比較する必要があります。
if(strncmp(sa,sb, length)==0 && strlen(sa)<=length) // sa being the null terminated one
...
strlen() は比較後に意図的にチェックされることに注意してください。これは、最初の文字が一致しない場合にヌルで終了する文字列のすべての文字を不必要に反復することを避けるためです。
最終的なバリアントは次のとおりです。
if(strncmp(sa,sb, length)==0 && sa[length]==0) // sa being the null terminated one
...
于 2015-03-11T20:52:33.453 に答える
1
1 つの方法を次に示します。
bool is_same_string(char const *s1, char const *s2, size_t s2_len)
{
char const *s2_end = s2 + s2_len;
for (;;)
{
if ( s1[0] == 0 || s2 == s2_end )
return s1[0] == 0 && s2 == s2_end;
if ( *s1++ != *s2++ )
return false;
}
}
于 2015-03-11T22:29:46.963 に答える
1
int compare(char *one, size_t onelen, char *two, size_t twolen)
{
int dif;
dif = memcmp(one, two, onelen < twolen ? onelen : twolen);
if (dif) return dif;
if (onelen == twolen) return 0;
return onelen > twolen? 1 : -1;
}
利用方法:
...
int result;
char einz[4] = "einz"; // not terminated
char *zwei = "einz"; // terminated
result = compare(einz, sizeof einz, zwei, strlen(zwei));
...
于 2015-03-11T21:03:33.520 に答える