为什么ostringstream strip为NULL?

时间:2011-07-14 07:54:49

标签: 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;
}

输出

Hello Universe
Hello Worldrse

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

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

3 个答案:

答案 0 :(得分:9)

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

所以,它不是ostringstream。这就是C字符串又名const char*的工作方式。

答案 1 :(得分:3)

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

os.write("World\0", 6);

答案 2 :(得分:0)

为什么您认为流操作比字符串更快?为什么在输出到cout之前构建字符串?

如果您想为输出添加前缀,可以像这样做

const std::string prefix = "Hello ";

std::cout << prefix << "Universe" << std::endl;
std::cout << prefix << "World" << std::endl;