【问题标题】:std::ostringstream isn't returning a valid stringstd::ostringstream 未返回有效字符串
【发布时间】:2012-06-22 22:31:54
【问题描述】:

我正在尝试使用 std::ostringstream 将数字转换为字符串 (char *),但它似乎不起作用。这是我的代码:

#include <windows.h>
#include <sstream>

int main()
{
    std::ostringstream out;
    out << 1234;

    const char *intString = out.str().c_str();

    MessageBox(NULL, intString, intString, MB_OK|MB_ICONEXCLAMATION);

    return 0;
}

生成的消息框根本没有文本。

这让我相信对out.str().c_str() 的调用返回了无效字符串,但我不确定。由于到目前为止我已经将这个程序精简了但仍然遇到问题,我一定犯了一个令人尴尬的简单错误。感谢您的帮助!

【问题讨论】:

  • +1 表示包含 SSCCE 的简洁明了的问题。不过,我在带有 GCC 4.7.1 的 Windows 7 中得到了正确的文本。
  • @chris :未定义的行为是未定义的。 ;-]

标签: c++ winapi std ostringstream


【解决方案1】:

out.str() 返回一个std::string 按值,这意味着您正在临时调用.c_str()。因此,在初始化 intString 时,它已经指向无效(已破坏)的数据。

缓存.str() 的结果并使用它:

std::string const& str = out.str();
char const* intString = str.c_str();

【讨论】:

  • const&amp; 看起来很尴尬。为什么不只是const std::string mystring(out.str());
  • @rubenvb : 你觉得有什么不同?
  • 嗨,ildjarn。我猜@rubenvb 的意思是:当开发人员阅读const std::string str(out.str()); 时,他立即明白str 是一个副本。但是const std::string&amp; str = out.str(); 给人的印象是str 只是对由另一个变量处理的string 的引用。第二种情况可能会令人困惑,不是吗?
  • @olibre : 第二种情况 is 只是对临时的引用... ;-]
  • 是的,我(昨天)问过reference to an unnamed temporary object,我提到了你上面的答案。 (注意:我的问题与 SO 上的任何其他问题都不重复,另一个问题是关于函数返回对象的生命周期)现在我理解了这个 C++ 技巧 :-) 但这并不明显!干杯;-)
猜你喜欢
  • 2014-12-03
  • 2020-09-26
  • 2017-05-06
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
相关资源
最近更新 更多