C++ C++;字符串到C字符串

C++ C++;字符串到C字符串,c++,c,string,C++,C,String,考虑以下代码: void fun (string &str1, string &str2) { const char* cstr; .... if(strlen(cstr = (str1+str2).c_str()) < 15) { // here cstr used } } void fun(字符串和str1、字符串和str2) { 常量字符*cstr; .... 如果(strlen(cstr=(str1+str2).c_str())

考虑以下代码:

void fun (string &str1, string &str2)
{
   const char* cstr;
....
   if(strlen(cstr = (str1+str2).c_str()) < 15)
   {
      // here cstr used
   }
}
void fun(字符串和str1、字符串和str2)
{
常量字符*cstr;
....
如果(strlen(cstr=(str1+str2).c_str())<15)
{
//这里使用cstr
}
}
条件本身工作正常,但在if条件体
cstr
中包含垃圾。为什么?

在这个表达式中:

cstr = (str1+str2).c_str()

您正在获取指向临时字符串的指针
str1+str2
。这个临时性在表达式末尾死亡,因此当您试图从IF代码> CSTR < /C> >中读取IF体时,您有未定义的行为。

< P>我假定C++代码中的<代码>字符串 >代码> STD::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 s=str1+str2;
//与s合作
如果(s.长度()<15){
//在这里使用
...
}
还要注意,我调用了
std::string::length()
方法,而不是C函数
strlen()
。您也可以使用
std::string::size()
方法


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

为什么你可以使用<代码> Struln < /代码>,当你可以使用<代码> STD::String::长度< /C> >?