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> >?