【发布时间】:2016-06-28 12:26:28
【问题描述】:
我一直在试图弄清楚子字符串算法(在另一个字符串中找到一个字符串)。 PHP使用,我在GitHub上的PHP源码中找到了如下一段代码:
我认为它使用了 Bruteforce,但我不确定,这就是为什么我在 SO 上寻求一些帮助。
zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const char *end) {
const char *p = haystack;
const char ne = needle[needle_len-1];
ptrdiff_t off_p;
size_t off_s;
if (needle_len == 1) {
return (const char *)memchr(p, *needle, (end-p));
}
off_p = end - haystack;
off_s = (off_p > 0) ? (size_t)off_p : 0;
if (needle_len > off_s) {
return NULL;
}
if (EXPECTED(off_s < 1024 || needle_len < 3)) {
end -= needle_len;
while (p <= end) {
if ((p = (const char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {
if (!memcmp(needle, p, needle_len-1)) {
return p;
}
}
if (p == NULL) {
return NULL;
}
p++;
}
return NULL;
} else {
return zend_memnstr_ex(haystack, needle, needle_len, end);
}
}
【问题讨论】:
-
在我看来像 Naïve string search 算法
-
请注意,
zend_memnstr_ex被称为更长的字符串。该函数使用Sunday algorithm。 -
请注意,如果
needle_len是0而不是返回haystack,则代码会调用未定义的行为。