我在支持一个使用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;
}
该程序输出“未找到”。如果我将针更改为较短的内容,则输出“找到了!”。如果我将尖括号换成其他字符,则可以找到。空格可以,但括号不行。
请注意,我在这里使用的是Borland字符串库:如果我包含< string >并使用std :: string,那么它的工作方式与我期望的完全相同。不幸的是,更改整个应用程序以使用STL字符串并不是可行的答案!
从文档中可以看出,Borland使用基于哈希的算法进行字符串搜索。我找不到更多关于此的详细信息,并且我已经步入了反汇编,但并没有更明智的想法。
我很难相信这真的是字符串库中的错误,特别是因为如果是这样的话,我希望能够找到一篇文章或类似的东西。我找不到这样的信息。
然而,我已经没有更多的想法了!这是一个已知的错误吗?有解决方法吗?
编辑:再次查看反汇编后,我认为它试图执行类似于Rabin-Karp算法的操作,其中哈希函数计算模33554393(小于2 ^ 25的最大质数)。它可能是以32为基数的多项式哈希函数(即a_0 + 32 a_1 + 32 ^ 2 a_2 +..+ 32 ^ n a_n),但这只是一种预感。听起来像是Daniel Fischer建议的可能溢出。
strstr()
)并迁移更改后的代码。令我惊讶的是,我找不到任何证据表明这是一个已知的库错误。 - Dave Turner