通常の C 文字列の場合、ヌル文字'\0'
はデータの終わりを示します。
についてはどうstd::string
ですか。ヌル文字が埋め込まれた文字列を使用できますか?
通常の C 文字列の場合、ヌル文字'\0'
はデータの終わりを示します。
についてはどうstd::string
ですか。ヌル文字が埋め込まれた文字列を使用できますか?
はい、ヌルを に埋め込むことができますstd::string
。
例:
std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);
注:std::string
のc_str()
メンバーは、返された char バッファーに常に null 文字を追加します。ただし、std::string
のdata()
メンバーは、返された char バッファーに null 文字を追加する場合と追加しない場合があります。
演算子 += に注意してください
注意すべきことの 1 つは、RHSoperator+=
で aを使用しないことです。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();
とメンバーは const ポインターを返すため、メモリを変更できないため、おそらくより一般的std::string
です。&buf.front() を使用すると、バッファの内容を直接自由に変更できます。data()
c_str()
はい。std::string は単なるvector<char>
利点です。
ただし、そのような獣を、呼び出し.c_str()
て 0 で停止するものに渡すことには注意してください。
できますが、なぜそうしたいのですか?std::string に NUL を埋め込むことは、問題を引き起こしているだけです。なぜなら、std::string を渡す関数は、その c_str() メンバーを非常によく使用する可能性があり、ほとんどの場合、最初の NUL が文字列の終わりを示していると想定するからです。したがって、これは良い考えではありません。また、UTF-8 では '\0' のみが 0 になることに注意してください。したがって、i18n の目的であっても、NUL を埋め込む正当な理由はありません。
うん、これは有効です。
文字列の途中にヌル文字を含めることができます。
ただし、途中でnull文字を含むstd::stringをac文字列関数で使用すると、未定義の動作の町になります-誰もそこにいたくない!!!:
int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!