gpt4 book ai didi

c++ - Borland 字符串::查找错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:18 26 4
gpt4 key购买 nike

我支持使用 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 建议的可能溢出。

最佳答案

我找到了一份 1998 年的引用资料,表明 Borland 的字符串搜索实现有一个错误:

https://groups.google.com/forum/?fromgroups=#!searchin/borland.public.cpp.language/cstring $20bug/borland.public.cpp.language/XBzjaJmCYpk/gtMPm-j8jugJ

此外,似乎在历史上的某个时刻,C++ 委员会决定将字符串类作为标准 C++ 的一部分,而 cstring 的字符串类是这一点的残余:

https://groups.google.com/forum/?fromgroups=#!searchin/borland.public.cpp.language/borland $20cstring/borland.public.cpp.language/2psY2seRmS4/ywVrqwU1C2wJ

关于c++ - Borland 字符串::查找错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15988512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com