如何检查一个string是否以C中的另一个string开头?

标准C库中是否有类似startsWith(str_a, str_b)东西?

它应该指向以空字节结尾的两个string,并告诉我第一个string是否也完全出现在第二个字符的开头。

例子:

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

显然这没有标准的C函数。 所以:

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

没有标准的function,但你可以定义

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

根据C标准(7.21.4.4/2),我们不必担心strpre短。

strncmp函数将从s1指向的数组中的不超过n字符(空字符strncmp字符不进行比较)与s2指向的数组进行比较。

我可能会去strncmp() ,但只是为了好玩的一个原始的实现:

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

我并不擅长编写优雅的代码,但是…

 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; } 

使用strstr()函数。 Stra == strstr(stra, strb)

因为我运行了公认的版本,并且遇到了很长的问题,所以我不得不添加下面的逻辑:

 bool longEnough(const char *str, int min_length) { int length = 0; while (str[length] && length < min_length) length++; if (length == min_length) return true; return false; } bool startsWith(const char *pre, const char *str) { size_t lenpre = strlen(pre); return longEnough(str, lenpre) ? strncmp(str, pre, lenpre) == 0 : false; } 

优化(v.2。 – 更正):

 uint32 startsWith( const void* prefix_, const void* str_ ) { uint8 _cp, _cs; const uint8* _pr = (uint8*) prefix_; const uint8* _str = (uint8*) str_; while ( ( _cs = *_str++ ) & ( _cp = *_pr++ ) ) { if ( _cp != _cs ) return 0; } return !_cp; } 

优化:

 boolean StartsWith(char *s1, char *s2) { while (*s1++ == *s2++) { } return *s2 == 0; } 
Interesting Posts