The deserialization library (messagepack) I am using does not provide null-terminated strings. Instead, I get a pointer to the beginning of the string and a length. What is the fastest way to compare this string to a normal null-terminated string?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
The fastest way is strncmp()
which limits the length to be compared.
if (strncmp(sa, sb, length)==0)
...
This assumes however that the length you use is the maximum length of the two strings. If the null terminated string could have a bigger length, you first have to compare the length.
if(strncmp(sa,sb, length)==0 && strlen(sa)<=length) // sa being the null terminated one
...
Note that the strlen() is checked on purpose after the comparison, to avoid unnecessarily iterating through all the characters o fthe null terminated string if the first caracters don't even match.
A final variant is:
if(strncmp(sa,sb, length)==0 && sa[length]==0) // sa being the null terminated one
...
回答2:
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;
}
usage:
...
int result;
char einz[4] = "einz"; // not terminated
char *zwei = "einz"; // terminated
result = compare(einz, sizeof einz, zwei, strlen(zwei));
...
回答3:
Here is one way:
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;
}
}