为了账号安全,请及时绑定邮箱和手机立即绑定

stringstream,string和char *转换混乱

stringstream,string和char *转换混乱

C++
智慧大石 2019-10-24 14:00:56
我的问题可以归结为,从stringstream.str().c_str()实时内存返回的字符串在哪里,为什么不能将其分配给const char*?此代码示例将比我更好地解释它#include <string>#include <sstream>#include <iostream>using namespace std;int main(){    stringstream ss("this is a string\n");    string str(ss.str());    const char* cstr1 = str.c_str();    const char* cstr2 = ss.str().c_str();    cout << cstr1   // Prints correctly        << cstr2;   // ERROR, prints out garbage    system("PAUSE");    return 0;}stringstream.str().c_str()可以分配给这个假设的假设const char*导致了一个错误,导致我花了一些时间来追踪。对于奖励积分,谁能解释为什么将cout语句替换为cout << cstr            // Prints correctly    << ss.str().c_str() // Prints correctly    << cstr2;           // Prints correctly (???)正确打印字符串?我正在Visual Studio 2008中进行编译。
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

stringstream.str()返回一个临时字符串对象,该对象在完整表达式的末尾被销毁。如果从该(stringstream.str().c_str())指向C字符串的指针,它将指向一个在语句结束处删除的字符串。这就是为什么您的代码会显示垃圾内容。


您可以将该临时字符串对象复制到其他字符串对象,并从该字符串对象中获取C字符串:


const std::string tmp = stringstream.str();

const char* cstr = tmp.c_str();

请注意,我做了临时字符串const,因为对它的任何更改都可能导致它重新分配,从而使其cstr无效。因此,更安全的是根本不存储对的调用结果,仅在完整表达式的末尾str()使用它cstr:


use_c_str( stringstream.str().c_str() );

当然,后者可能并不容易,并且复制可能过于昂贵。相反,您可以做的是将临时绑定到const引用。这会将其寿命延长到参考的寿命:


{

  const std::string& tmp = stringstream.str();   

  const char* cstr = tmp.c_str();

}

IMO是最好的解决方案。不幸的是,它不是很知名。


查看完整回答
1 反对 回复 2019-10-24
  • 3 回答
  • 0 关注
  • 2405 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信