在C或C ++中是否有函数实现反向memmem?

时间:2012-09-05 04:04:14

标签: c++ c algorithm function

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

在C或C ++中是否有函数实现反向搜索? 如果是这样,哪一个? 感谢。

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

尝试这样做以解决您的问题是不正确的;如果您已经知道标题的长度,则无法对\r\n\r\n进行搜索;它位于n-4位置n的长度。如果您不知道长度,那么从头开始计算长度只需要搜索\r\n\r\n

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

答案 3 :(得分:0)

是的。

假设headerstd::string

header.rfind( "\r\n\r\n" );

答案 4 :(得分:0)

是的,有 - 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 found\n";
else                   cout << "at: " << result - str.begin() << "\n";

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