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