我想在HTTP标头中找到“\ r \ n \ r \ n”。 我知道它在数据包的末尾,所以如果我反向搜索“\ r \ n \ r \ n”,我将获得良好的性能。
在C或C ++中是否有函数实现反向搜索? 如果是这样,哪一个? 感谢。
答案 0 :(得分:10)
反向搜索“\ r \ n \ r \ n”可能会给您错误的结果。这是不正确的逻辑,因为HTTP正文可能包含“\ r \ n \ r \ n”。
答案 1 :(得分:1)
在C ++中,许多容器提供rbegin()
和rend()
,它们反向实现迭代。然后,您可以将这些算法交给任何标准算法。
答案 2 :(得分:0)
尝试这样做以解决您的问题是不正确的;如果您已经知道标题的长度,则无法对\r\n\r\n
进行搜索;它位于n-4
位置n
的长度。如果您不知道长度,那么从头开始计算长度只需要搜索\r\n\r\n
。
话虽如此,如何做一个"反向" strstr
或memmem
有效。对于strstr
,最佳方法是简单地重复调用前向strstr
,使用前一个匹配加一个起始点的一个字符,并保持找到的最后一个出现。对于memmem
,通过调整最优前向算法以反向运行(基本上只是否定所有索引),可以获得更高的性能。
答案 3 :(得分:0)
是的。
假设header
是std::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[]