我支持使用 Borland C++ Builder 5.02(从 1997 年开始)编写的 C++ 应用程序。Borland 字符串类的 find() 方法的行为与我预期的不同:
#include <cstring>
#include <iostream>
int main (int argc, char *argv[])
{
string needle = "length == eighteen";
string haystack = "<" + needle + ">";
if (haystack.find(needle) != NPOS)
cout << "Found it!" << endl;
else
cout << "Not found" << endl;
return 0;
}
该程序输出Not found
. 如果我把针换成更短的,它会输出Found it!
。如果我将尖括号换成其他字符,它会找到它。空格有效,但括号也无效。
请注意,我在这里使用的是 Borland 字符串库:如果我改为#include <string>
使用它,std::string
那么它的工作方式与我期望的完全一样。遗憾的是,将整个应用程序更改为使用 STL 字符串并不是一个可行的答案!
从文档看来,Borland 使用基于哈希的算法进行字符串搜索。我找不到有关此的更多详细信息,并且我已经完成了拆卸,但并不聪明。
我很难相信这真的是字符串库中的一个错误,特别是因为如果是这样的话,我希望能够找到一篇文章或关于它的东西。我找不到任何此类信息。
但是,我已经没有想法了!这是一个已知的错误?有解决办法吗?
编辑:再次查看反汇编后,我认为它正在尝试执行类似 Rabin-Karp 算法的操作,其中哈希函数的计算方式为 mod 33554393(最大素数 < 2^25)。它很可能是底数为 32 的多项式哈希函数(即 a_0 + 32 a_1 + 32^2 a_2 + .. + 32^n a_n),但这只是一种预感。正如 Daniel Fischer 所建议的那样,听起来可能会溢出。