6

我有一个字符串,其最后一部分(后缀)需要多次更改,我需要生成新字符串。我正在尝试使用 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作品。但想知道它在内部是如何工作的。也想知道是否有更快的方法来做同样的事情。

4

3 回答 3

10

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

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

于 2011-07-14T08:00:05.273 回答
3

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

os.write("World\0", 6);
于 2011-07-14T08:00:04.283 回答
0

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

如果您想要输出的前缀,您可以这样做

const std::string prefix = "Hello ";

std::cout << prefix << "Universe" << std::endl;
std::cout << prefix << "World" << std::endl;
于 2011-07-14T09:44:07.083 回答