【问题标题】:C++ string to C stringC++ 字符串到 C 字符串
【发布时间】:2020-08-23 03:56:15
【问题描述】:

考虑以下代码:

void fun (string &str1, string &str2)
{
   const char* cstr;
....
   if(strlen(cstr = (str1+str2).c_str()) < 15)
   {
      // here cstr used
   }
}

条件本身工作正常,但在 if 条件主体 cstr 中包含垃圾。为什么?

【问题讨论】:

  • 可以使用std::string::length,为什么还要使用strlen

标签: c++ c string


【解决方案1】:

在这个表达式中:

cstr = (str1+str2).c_str()

您正在获取指向 临时 字符串 str1 + str2 的指针。这个临时在表达式的末尾消失,因此当您尝试从 if-body 中的 cstr 读取时,您会出现未定义的行为。

【讨论】:

    【解决方案2】:

    我假设您的 C++ 代码中的 stringstd::string

    str1 + str2 产生一个 临时 std::string 对象。您在其上调用c_str() 方法,并获得一个指向此临时 std::string 对象数据的C 风格字符串指针。

    当临时 std::string 超出范围并被销毁时,cstr 原始 C 样式指针悬空,指向无效内存。

    如果您需要处理串联的字符串str1 + str2,我建议您将其安全地存储在-临时std::string 对象中,例如:

    std::string s = str1 + str2;
    // Work with s
    if (s.length() < 15) {
        // Use s here
        ...
    }
    

    还要注意我调用了std::string::length() 方法而不是C 函数strlen()。您也可以使用std::string::size() 方法。

    一般来说,在 C++ 代码中,您应该使用方便的字符串(如std::string),而不是 C 风格的原始字符串指针。

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 2012-11-04
      • 2013-10-25
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2014-02-05
      • 2016-03-05
      • 1970-01-01
      相关资源
      最近更新 更多