44

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

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

4

4 に答える 4

45

はい、ヌルを に埋め込むことができますstd::string

例:

std::string s;
s.push_back('\0');
s.push_back('a');
assert(s.length() == 2);

注:std::stringc_str()メンバーは、返された char バッファーに常に null 文字を追加します。ただし、std::stringdata()メンバーは、返された 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()

于 2010-05-16T22:43:40.733 に答える
7

はい。std::string は単なるvector<char>利点です。

ただし、そのような獣を、呼び出し.c_str()て 0 で停止するものに渡すことには注意してください。

于 2010-05-16T22:44:26.940 に答える
0

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

于 2010-05-16T22:56:40.203 に答える
-3

うん、これは有効です。

文字列の途中にヌル文字を含めることができます。

ただし、途中でnull文字を含むstd::stringをac文字列関数で使用すると、未定義の動作の町になります-誰もそこにいたくない!!!:

 int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!
于 2010-05-16T22:43:37.430 に答える