【问题标题】:C++ stringstream concatenate queryC++ 字符串流连接查询
【发布时间】:2012-09-05 12:21:46
【问题描述】:

代码应该将 argv[1] 与 .txt 和 _r.txt 连接起来。

std::stringstream sstm;
std::stringstream sstm_r;

sstm<<argv[1]<<".txt";
sstm_r<<argv[1]<<"_r.txt";

const char* result = sstm.str().c_str();
const char* result_r = sstm_r.str().c_str();

fs.open(result);
fs_r.open(result_r);

cout<<result<<endl;
cout<<result_r<<endl;

但它的作用是, 当我输入 "abc" 作为 argv[1] 时,它给我的结果是 "abc_r.tx0" 和 result_r 也相同 "abc_r.tx0"。什么是正确的方法,为什么这是错误的。

【问题讨论】:

  • 因为 c_str(),它不是来自 c 的遗留元素吗?
  • 您的问题有些可疑。代码有“.txt”,而文本有“.tx0”。您确定您在问题中提供了正确/最新的信息吗?
  • sstm.str() 是临时字符串,sstm.str().c_str() 也是。两者都只在表达式结束之前有效,但是您正在存储 c_str 指针并稍后访问它。你有未定义的行为。
  • @AlexeyFrunze 是的,我确定。
  • @rajat 如果 C 中不存在 std::stringc_str() 怎么能成为旧版 C

标签: c++ string


【解决方案1】:

像这样处理字符串:

{
  const std::string& tmp = stringstream.str();
  const char* cstr = tmp.c_str();
}

这取自another exchange here

【讨论】:

    【解决方案2】:

    c_str() 返回的指针所关联的 std::string 实例将被销毁,留下 resultresult_r 作为悬空指针,导致未定义的行为。如果要使用c_str(),则需要保存std::string 实例:

    const std::string result(sstm.str());
    
    fs.open(result.c_str());  /* If this is an fstream from C++11 you
                                 can pass a 'std::string' instead of a
                                 'const char*'. */
    

    【讨论】:

    • 对不起,这不好用。它在文件名的末尾给了我一个尾随问号。是什么导致了这个问题。
    • @rajat,假设填充了argv[1],代码是正确的。请参阅ideone.com/alBG9 进行演示。
    • 它不能依赖于 argv[1] 的填充方式,因为我在文件名末尾得到问号而不是在中间,因为我像这样嵌入 .txt sstm
    • 你能不能试试看你写一个文件会不会遇到同样的问题。
    猜你喜欢
    • 2012-01-04
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2017-06-04
    • 2014-12-07
    相关资源
    最近更新 更多