web-dev-qa-db-ja.com

std :: string( "\ x00")が長さ0を報告するのはなぜですか?

文字列をエンコードする必要がある関数があります。これは、有効な「バイト」として0x00を受け入れることができる必要があります。私のプログラムは文字列の長さをチェックする必要がありますが、_"\x00"_を_std::string_に渡すと、length()メソッドは0を返します。

文字列が単一のヌル文字であっても、実際の長さを取得するにはどうすればよいですか?

27
Adamski

空の文字列を渡しています。代わりにstd::string(1, '\0')を使用してください。

またはstd::string{ '\0' }(ありがとう、@ zett42)

29
Sid S

std::stringは、nullを完全に保存できます。ただし、const char*はそうではないので注意する必要があります。また、const char*を非常に簡単に作成し、そこからstd::stringを作成します。

std::string a("\x00");

これにより、ヌル文字のみが含まれ、その後にヌルターミネータが続く定数C文字列が作成されます。しかし、Cストリングは、それらがどれくらいの長さであるかを知りません。したがって、文字列は、最初の文字である最初のヌルターミネータまで実行されると見なします。したがって、長さゼロの文字列が作成されます。

std::string b("");
b.Push_back('\0');

std::stringはnullクリーンです。文字(\0)も自由にゼロバイトにすることができます。したがって、ここでは、データ構造を正しく読み取ることを妨げるものは何もありません。 bの長さは1になります。

一般に、ヌル文字を含むCストリングを作成しないようにする必要があります。ファイルから入力を直接std::stringに読み込むか、文字を一度に1つずつプッシュすることを確認すると、目的の結果を得ることができます。ヌル文字を含む定数文字列が本当に必要な場合は、\0の代わりに他のセンチネル文字を使用することを検討し、'\0'に読み込んだ後に(really必要な場合)それらの文字をstd::stringに置き換えます。

45
Silvio Mayolo

C++ 14では、 文字列リテラル演算子 を使用して、nullバイトの文字列を格納できます。

using namespace std::string_literals;

std::string a = "\0"s;
std::string aa = "\0\0"s; // two null bytes are supported too
24
Erbureth