【问题标题】:compare buffer with const char* in C++在 C++ 中将缓冲区与 const char* 进行比较
【发布时间】:2009-05-18 13:33:56
【问题描述】:

比较内存缓冲区和常量字符串的正确 C++ 方法是什么 - strcmp(buf, "sometext") ?我想避免由于创建临时 std::string 对象而导致不必要的内存复制。

谢谢。

【问题讨论】:

  • 请使用 std::string 发布一些代码,说明您的问题。

标签: c++ string comparison


【解决方案1】:

如果您知道缓冲区的内容,则 strcmp 很好。 std::strncmp 可能会为您提供更多防止缓冲区溢出的安全性。

【讨论】:

    【解决方案2】:

    如果您只是检查是否相等,您可以使用std::equal

    #include <algorithms>
    
    const char* text = "sometext";
    const int len = 8; // length of text
    
    if (std::equal(text, text+len, buf)) ...
    

    当然,如果您的缓冲区可以小于文本,这将需要额外的逻辑

    【讨论】:

      【解决方案3】:

      strcmp 工作正常,没有复制。或者,您也可以使用memcmp。但是,在 C++ 中,为什么不使用std::strings?

      【讨论】:

      • 如果我将 buf 转换为 std::string 缓冲区内容将被复制到字符串对象中 - 我想避免,因为经过比较后我与它无关。
      • strncmp 稍微安全一些,但您必须确保为 'n' 输入正确的值。或者,如果您知道缓冲区比您要比较的常量字符串长,那么 strcmp 就可以了。
      【解决方案4】:

      我将使用 memcmp,并作为最后一个参数,使用 2 种数据大小中的最小值。

      还要检查以确保这 2 个尺寸相同,否则您只是在比较最短的那个的前缀。

      【讨论】:

      • 他的数据还没有放在一个字符串中——他试图避免把它放在一个字符串中。
      【解决方案5】:

      你可以这样做,

      const char* const CONST_STRING = "sometext";
      
      strcmp(buf,CONST_STRING);
      

      【讨论】:

      • 从以上所有答案中,我了解到 C++/STL 没有工具可以进行这种比较,必须使用简单的 C 方法?
      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2014-05-17
      • 2013-12-21
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多