如何检查一个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),我们不必担心str
比pre
短。
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; }