在C或C++中有实现反向memmem的函数吗

Is there a function implement reverse memmem in C or C++ ?

本文关键字:memmem 函数 实现 C++      更新时间:2023-10-16

我想在HTTP标头中找到"\r\n\r\n"。我知道它在数据包的末尾,所以如果我反向搜索"\r\n\r\n",我会得到很好的性能。

在C或C++中有实现反向搜索的函数吗?如果是,是哪一个?谢谢

反向搜索"\r\n\r\n"可能会得到错误的结果。这不是正确的逻辑,因为HTTP正文可能包含"\r\n\r\n"。

在C++中,许多容器提供rbegin()rend(),它们反向实现迭代。然后你可以把这些交给任何一个标准算法。

例如std::string::rbegin()std::string::rend()

试图这样做来解决问题是不正确的;如果您已经知道标头的长度,则不需要搜索rnrn;它位于CCD_ 6位置,其中CCD_。如果您不知道长度,那么从头开始计算长度所花费的时间与搜索rnrn的时间一样长。

话虽如此,如何进行"反向"strstrmemmem的问题是有效的。对于strstr,最佳方法是简单地重复调用前向strstr,使用前一个匹配加上起点上的一个字符,并保持最后一个出现。对于memmem,通过调整最佳正向算法以反向运行(基本上只是否定所有索引),可以获得更高的性能。

是的,有-std::find_end。像这样使用:

string  str = "abcabc";
string  substr = "abc";     
string::iterator ret = 
  std::find_end(str.begin(), str.end(), substr.begin(), substr.end());
if (ret == str.end())  cout << "not foundn";
else                   cout << "at: " << result - str.begin() << "n";

此外,如果您在std::string中搜索,则有std::string::rfind()方法。std::find_end()适用于任何容器,包括char[]

是的。

假设headerstd::string:

header.rfind( "rnrn" );