为什么ostringstream strip为NULL?

bal*_*lki 5 c++ string-concatenation ostringstream

我有一个字符串,其最后一部分(后缀)需要多次更改,我需要生成新的字符串.我正在尝试使用ostringstream执行此操作,因为使用流将比字符串连接更快.但是当前一个后缀大于后一个后缀时,它会搞砸.流也剥离了空字符.

#include<iostream>
#include<sstream>

using namespace std;

int main()
{
  ostringstream os;
  streampos pos;
  os << "Hello ";
  pos = os.tellp();
  os << "Universe";
  os.seekp(pos);
  cout<<  os.str() << endl;
  os << "World\0";
  cout<<  os.str().c_str() << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

产量

Hello Universe
Hello Worldrse
Run Code Online (Sandbox Code Playgroud)

但我想要Hello World.我该怎么做呢?有没有其他方法可以更快的方式做到这一点?

编辑: 附加std::ends作品.但想知道它是如何在内部工作的.还想知道是否有更快的方法来做同样的事情.

MSa*_*ers 9

字符串"World"已经以空值终止.这就是C字符串的工作方式."World\0"有两个\0字符.因此,operator<<(ostream&, const char*)将它们视为相同,并将所有字符复制到\0.如果你试试,你可以更清楚地看到这一点os << "World\0!".该!不会都被复制,因为operator<<在第一次停\0.

所以,事实并非如此ostringstream.这就是C字符串的const char*工作方式.


Cat*_*lus 3

它不会剥离任何东西。C++ 中的所有字符串文字均以 NUL 终止,因此对于处理该字符串的任何人而言,通过手动插入一个字符串,您只需完成该字符串即可。使用ostream::writeostream::put,如果您需要这样做 \xe2\x80\x94 任何期望的东西char*(没有额外的大小参数)很可能会特殊对待它。

\n\n
os.write("World\\0", 6);\n
Run Code Online (Sandbox Code Playgroud)\n