【问题标题】:Appending one stringstream to another. What's safest?将一个字符串流附加到另一个。什么最安全?
【发布时间】:2012-05-11 19:29:46
【问题描述】:

以下有什么区别

stringstream a;
stringstream b;
a << "hi";
b << "there";

a &lt;&lt; " " &lt;&lt; b.rdbuf();a &lt;&lt; " " &lt;&lt; b.str();a &lt;&lt; " " &lt;&lt; b.str().c_str();


我一直在使用 rdbuf()。我确实注意到 C++ 参考中提到 stringstream::rdbuf:

请注意,对于任何成功构造的 istringstream 对象,此 指针永远不会为 NULL,即使缓冲区字符串为空。

我认为这意味着 rdbuf() 不会返回 NULL?我不能通过NULL。我有过这样的错误char *array = NULL; a &lt;&lt; array;。如果 stringstream b 为空,那么在执行a &lt;&lt; b.rdbuf() &lt;&lt; "some text" 时是否定义了行为?在那种情况下,rdbuf 返回的第一个字符不会有 eof 特征,因此不会附加 b 中的任何内容吗?

谢谢

【问题讨论】:

  • 旁白:cplusplus.com 不是“ C++ 参考”,而是“a C++ 参考”。为了正确起见,许多人更喜欢cppreference.com。当然, 参考是 ISO C++ 标准,无论是 2003 还是 2011 版本。
  • 显而易见的a &lt;&lt; " " &lt;&lt; b; 呢?
  • @moooeeeep 你不能那样追加字符串流。
  • 当然,只是检查是否编译,而不是是否产生预期的结果。

标签: c++ stringstream


【解决方案1】:

有什么区别?

它们在效果上都是相同的,但它们的性能或效率可能不同。

我认为这意味着 rdbuf() 不会返回 NULL?

你没看错。

如果字符串流 b 为空,那么行为是否已定义?

是的。

在这种情况下,rdbuf 返回的第一个字符不会有 eof 特征吗?

没有。第一次调用.sgetc()(或.snextc())不会返回具有eof 特征的字符,它会返回EOF(不是字符)。因此,您的示例相当于a &lt;&lt; "" &lt;&lt; "some text"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2014-10-05
    • 2011-05-25
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多