Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Borland字符串::查找bug 我支持使用Borland C++ Builder 5.02(1997)编写的C++应用程序。Borland string类上的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; } #包括 #包括 int main(int argc,char*argv[]) { 字符串针=“长度==18”; 字符串haystack=“”; if(haystack.find(针)!=NPOS) cout_C++_String_C++builder_C++builder 5 - Fatal编程技术网

Borland字符串::查找bug 我支持使用Borland C++ Builder 5.02(1997)编写的C++应用程序。Borland string类上的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; } #包括 #包括 int main(int argc,char*argv[]) { 字符串针=“长度==18”; 字符串haystack=“”; if(haystack.find(针)!=NPOS) cout

Borland字符串::查找bug 我支持使用Borland C++ Builder 5.02(1997)编写的C++应用程序。Borland string类上的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; } #包括 #包括 int main(int argc,char*argv[]) { 字符串针=“长度==18”; 字符串haystack=“”; if(haystack.find(针)!=NPOS) cout,c++,string,c++builder,c++builder-5,C++,String,C++builder,C++builder 5,您没有使用Borland字符串库。string(大写S)是Borland字符串类。string(小写S)与std::string完全相同,是STL字符串类,它不是Borland实现(BCB5中的STL是RogueWave STL)。您使用#include可能会将std::string引入全局命名空间,这就是代码编译的原因。但是您确实应该使用#include和std::string来代替。至于NPOS,您应该使用string::NPOS,因为这就是string::find()实际返回 #inclu

您没有使用Borland字符串库。
string
(大写S)是Borland字符串类。
string
(小写S)与
std::string
完全相同,是STL字符串类,它不是Borland实现(BCB5中的STL是RogueWave STL)。您使用
#include
可能会将
std::string
引入全局命名空间,这就是代码编译的原因。但是您确实应该使用
#include
std::string
来代替。至于
NPOS
,您应该使用
string::NPOS
,因为这就是
string::find()
实际返回

#include <cstring>
#include <iostream>

int main (int argc, char *argv[])
{
   string needle = "length == eighteen";
   string haystack = "<" + needle + ">";
   if (haystack.find(needle) != string::npos)
      cout << "Found it!" << endl;
   else
      cout << "Not found" << endl;

   return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
字符串针=“长度==18”;
字符串haystack=“”;
if(haystack.find(针)!=string::npos)

cout我在1998年的一篇参考文献中发现,Borland搜索字符串的实现有一个bug:

$20bug/borland.public.cpp.language/XBzjaJmCYpk/gtMPm-j8jugJ

也发现,在历史上某个时候,C++委员会决定一个字符串类是标准C++的一部分,而cstring的字符串类是这个词的一个残余:


$20cstring/borland.public.cpp.language/2psY2seRmS4/ywVrqwU1C2wJ

如果您有原始的BC++5.02安装磁盘,则可以在BC5\source\RTL\source\string下找到字符串类源

下面是string::find_case_index()函数(由string::find()调用)代码的摘录:

const long q=33554393L;

const long q32=q“基于散列的算法”,“如果我将指针改短一些”,这就是依赖15年历史的编译器时会发生的情况。是时候继续前进了。@PeterWood如果没有budget@DavidHeffernan这个问题是作为迁移项目的一部分出现的(完全可行且非常有利可图)系统转向更现代的编译器。我们正在做的是“继续前进”。但它必须保持与当前一样的工作状态,并告诉我要怀疑我自己在库错误上的错误,因为前者的可能性更大。因此,问题就来了。@DavidHeffernan我不在乎修复库。如果它是已知的库错误,那么我们可以调整更改应用程序以解决此问题(例如,使用
strstr()
)并迁移修改后的代码。令我惊讶的是,我找不到任何证据表明这是一个已知的库错误。我不确定我们谈论的是类库的同一版本。我在我的系统中找不到
String
类,我使用的
String
肯定不是
std::String
-例如,它有一个
contains()你说你安装了BCB5——是5.02还是5.5?你能编译和运行我给的程序吗?如果是这样,你会看到同样的输出吗?这将是最有帮助的。@ DaveTurner:我不认为我们甚至在谈论同一个产品。你说你使用的是Borland C++ Builder(我安装的东西)。但是,我认为你实际上是在使用Borland C++,它们不是同一个产品。在Borland C++中,cString。h定义了一个非标准的代码>字符串< /Cort >类,它不是STL<代码> STD::String 类。@ Borland C++ Builder使用STL <代码> STD::String 类,并且它的VCL框架也定义了一个单独的<代码>系统。tem::String
类,与Delphi二进制兼容。谢谢,这太棒了。我确信某处有一张安装CD;我甚至从未想过要查看它的源代码。如果您找到了CD并决定尝试对源代码进行修复,请在此处查看如何构建RTL的说明,以及对另一个错误的修复:
#include <string>
#include <iostream>

int main (int argc, char *argv[])
{
   std::string needle = "length == eighteen";
   std::string haystack = "<" + needle + ">";
   if (haystack.find(needle) != std::string::npos)
      std::cout << "Found it!" << std::endl;
   else
      std::cout << "Not found" << std::endl;

   return 0;
}
const long q = 33554393L;
const long q32 = q<<5;

size_t testlength = length() - startindex;
size_t patternlength = patl = strlen(cp);
if( testlength < patternlength )
    return NPOS;
if( patternlength == 0 )
    return 0;

long patternHash = 0;
long testHash = 0;

const char _FAR *testP = c_str()+startindex;
const char _FAR *patP = cp;
long x = 1;
size_t i = patternlength-1;

while( i-- )
    x = (x<<5)%q;

for( i=0; i<patternlength; i++ )
    {
    patternHash = ( (patternHash<<5) + *patP++  ) % q;
    testHash    = ( (testHash   <<5) + *testP++ ) % q;
    }

testP = c_str()+startindex;
const char _FAR *end = testP + testlength - patternlength;

while (1)
    {

    if(testHash == patternHash)
        if( !get_paranoid_check_flag() ||
            !strncmp( testP, cp, patternlength) )
          return (size_t)(testP-c_str());

    if( testP >= end )
        break;

    // Advance & calculate the new hash value:
    testHash = ( testHash + q32 - *testP * x                 ) % q;
    testHash = ( (testHash<<5)  + *(patternlength + testP++) ) % q;
    }
return NPOS;          // Not found.