通常のC文字列の場合、ヌル文字'\0'
はデータの終わりを示します。
std::string
はどうですか?ヌル文字が埋め込まれた文字列を使用できますか?
はい、_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()を使用すると、バッファの内容を直接自由に変更できます。
はい。 std :: stringは単なる_vector<char>
_であり、利点があります。
ただし、そのような獣を.c_str()
を呼び出し、0で停止するものに渡す場合は注意が必要です。
できますが、なぜしたいのですか? std :: stringにNULを埋め込むと、問題が発生します。これは、std :: stringを渡す関数がc_str()メンバーを使用する可能性が非常に高く、ほとんどの場合、最初のNULが文字列の終わりを示していると想定するためです。したがって、これを行うのは良い考えではありません。また、UTF-8では、「\ 0」のみが0になるため、i18nの目的であっても、NULを埋め込む理由はありません。