文字列をエンコードする必要がある関数があります。これは、有効な「バイト」として0x00を受け入れることができる必要があります。私のプログラムは文字列の長さをチェックする必要がありますが、_"\x00"
_を_std::string
_に渡すと、length()
メソッドは0を返します。
文字列が単一のヌル文字であっても、実際の長さを取得するにはどうすればよいですか?
空の文字列を渡しています。代わりにstd::string(1, '\0')
を使用してください。
またはstd::string{ '\0' }
(ありがとう、@ zett42)
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
に置き換えます。
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