【发布时间】:2013-04-05 23:50:19
【问题描述】:
我支持使用 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(最大素数
【问题讨论】:
-
“基于哈希的算法”,“如果我把针改短一些”
-
当您依赖 15 年的编译器时会发生这种情况。是时候继续前进了。
-
@PeterWood 在没有预算的情况下很难保持现状
-
@DavidHeffernan 这个问题是作为将这个(完全工作且非常有利可图的)系统迁移到更现代的编译器的项目的一部分而出现的。 “继续前进”是我们正在做的事情。但它必须像现在一样继续工作,pragmatictips.com/26 告诉我怀疑我自己对库错误的错误,因为前者的可能性更大。因此问题。
-
@DavidHeffernan 我不关心修复库。如果这是一个已知的库错误,那么我们可以证明更改应用程序以解决它(例如使用
strstr())并迁移更改的代码是合理的。令我惊讶的是,我找不到任何证据表明这是一个已知的库错误。
标签: c++ string c++builder c++builder-5