web-dev-qa-db-ja.com

std :: stringにnullを埋め込むことはできますか?

通常のC文字列の場合、ヌル文字'\0'はデータの終わりを示します。

std::stringはどうですか?ヌル文字が埋め込まれた文字列を使用できますか?

38
WilliamKF

はい、_std::string_にnullを埋め込むことができます。

例:

_std::string s;
s.Push_back('\0');
s.Push_back('a');
assert(s.length() == 2);
_

注:_std::string_のc_str()メンバーは、返されたcharバッファーに常にヌル文字を追加します。ただし、_std::string_のdata()メンバーは、返されたcharバッファーにヌル文字を追加する場合と追加しない場合があります。

演算子に注意してください+ =

注意すべきことの1つは、RHSで_operator+=_を_char*_と一緒に使用しないことです。ヌル文字になるまで合計されます。

例えば:

_std::string s = "hello";
s += "\0world";
assert(s.length() == 5);
_

正しい方法:

_std::string s = "hello";
s += std::string("\0world", 6);
assert(s.length() == 11);
_

std :: vectorを使用するためにより一般的なバイナリデータの保存

一般に、_std::vector_を使用して任意のバイナリデータを格納するのが一般的です。

_std::vector<char> buf;
buf.resize(1024);
char *p = &buf.front();
_

_std::string_のdata()およびc_str()メンバーはconstポインターを返すため、メモリーは変更できないため、おそらくより一般的です。 &buf.front()を使用すると、バッファの内容を直接自由に変更できます。

40
Brian R. Bondy

はい。 std :: stringは単なる_vector<char>_であり、利点があります。

ただし、そのような獣を.c_str()を呼び出し、0で停止するものに渡す場合は注意が必要です。

7
bmargulies

できますが、なぜしたいのですか? std :: stringにNULを埋め込むと、問題が発生します。これは、std :: stringを渡す関数がc_str()メンバーを使用する可能性が非常に高く、ほとんどの場合、最初のNULが文字列の終わりを示していると想定するためです。したがって、これを行うのは良い考えではありません。また、UTF-8では、「\ 0」のみが0になるため、i18nの目的であっても、NULを埋め込む理由はありません。