【问题标题】:Is there a function implement reverse memmem in C or C++ ?有没有用 C 或 C++ 实现反向 memmem 的函数?
【发布时间】:2012-09-05 04:04:13
【问题描述】:

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

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

【问题讨论】:

  • 一条 HTTP 消息不被分成“数据包”。它只是一个字节流。 HTTP 正文将紧跟 HTTP 标头,并且在正文中当然可以包含“\r\n\r\n”。我建议通过标题向前搜索,而不是向后搜索,因为如果向后搜索,你不知道从哪里开始查找。
  • @GregHewgill 很好的答案。由于无论如何您都需要向前扫描以找到头球的末端,因此在向前传球时将其捡起会更有效。

标签: c++ c algorithm function


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        是的,有 - 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[]

        【讨论】:

          【解决方案5】:

          是的。

          假设headerstd::string

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

          【讨论】:

          • @LeonidVolnitsky 我绝对做到了。谢谢你的收获。
          猜你喜欢
          • 1970-01-01
          • 2021-04-21
          • 1970-01-01
          • 2014-09-01
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多