2011-07-14 6 views
5

私は、最後の部分(サフィックス)を何度か変更する必要があり、新しい文字列を生成する必要がある文字列を持っています。ストリームを使用すると文字列の連結よりも速くなると思うので、私はostringstreamを使ってこれを行うようにしています。しかし、前の接尾辞が後の接尾辞よりも大きければ、それはうんざりします。ストリームはヌル文字も取り除きます。なぜostringstreamはNULLを削除しますか?

#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が追加されます。しかし、それが内部的にどのように動作するのだろうか。また、同じことをするより速い方法があるかどうかを知りたい。

+1

のようにそれを行うことができませんでした - あなたは 'のstd ::文字列の変異体のいずれかを検討する必要があります。 :replace() ' – Nim

答えて

3

何も剥がれません。 C++のすべての文字列リテラルはNULで終了するので、手作業で挿入することによって、文字列を処理している人がいれば終了します。 ostream::writeまたはostream::putを使用する必要がある場合 - char*(サイズについて追加の引数なし)が必要なものは、特別に扱われる可能性が高いでしょう。

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

文字列「World」はすでにNULLで終了しています。これがCの文字列の仕組みです。 "World \ 0"には2つの\0文字があります。したがって、operator<<(ostream&, const char*)は同じものを扱い、すべての文字を\0までコピーします。 os << "World\0!"を試してみると、これをさらに明確に見ることができます。 !は、operator<<が最初の\0に停止しているため、まったくコピーされません。

だから、それはostringstreamではありません。 Cの文字列は、const char*と同じように動作します。

0

なぜストリーム操作が文字列より高速だと思いますか?なぜ文字列を作成してから出力するのですか?あなたは、出力の先頭の文字列をしたい場合は

あなただけにstringstreamを最も効率的になるようにしてくださいませ。この

const std::string prefix = "Hello "; 

std::cout << prefix << "Universe" << std::endl; 
std::cout << prefix << "World" << std::endl; 
関連する問題