簡體   English   中英

為什么std :: string(“ \\ x00”)報告的長度為0?

[英]Why does std::string(“\x00”) report length of 0?

我有一個需要對字符串進行編碼的函數,該函數需要能夠接受0x00作為有效的“字節”。 我的程序需要檢查字符串的長度,但是如果我將"\\x00"傳遞給std::stringlength()方法將返回0。

即使字符串是單個空字符,如何獲得實際長度?

std::string完全能夠存儲空值。 但是,您必須警惕,因為不是const char* ,並且非常簡短地構造了const char* ,從中可以創建std::string

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

這將創建一個僅包含空字符和后跟一個空終止符的常量C字符串。 但是C字符串不知道它們有多長。 因此字符串認為它一直運行到第一個空終止符(即第一個字符)為止。 因此,創建了一個零長度的字符串。

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

std::string為null-clean。 字符( \\0 )也可以自由為零字節。 因此,在這里,沒有什么阻止我們正確讀取數據結構。 b的長度將為1

通常,您需要避免構造包含空字符的C字符串。 如果您將文件中的輸入直接讀取到std::string或者確保一次將一個字符推入一個,則可以獲得所需的結果。 如果您確實需要一個包含空字符的常量字符串,請考慮使用其他一些前哨字符而不是\\0 ,然后(如果確實需要)在加載到std::string之后將這些字符替換為'\\0'

您正在傳遞一個空字符串。 使用std::string(1, '\\0')代替。

std::string{ '\\0' } (感謝@ zett42)

在C ++ 14中,可以使用字符串文字運算符存儲具有空字節的字符串:

using namespace std::string_literals;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM