[英]Not sure why I am getting different lengths when using a string or a char
當我使用char調用gethostname時,我的長度為25,但是當我使用字符串時,我的長度為64。不確定為什么。 我倆都在HOST_NAME_MAX上聲明了相同的大小。
char hostname[HOST_NAME_MAX];
BOOL host = gethostname(hostname, sizeof hostname);
expectedComputerName = hostname;
int size2 = expectedComputerName.length();
std::string test(HOST_NAME_MAX, 0);
host = gethostname(&test[0], test.length());
int testSize = test.length();
一個std::string
對象可以包含NUL
(即'\\0'
字符)。 您將名稱存儲在創建的字符串對象的前幾個字節中,該字符串對象的長度為HOST_NAME_MAX
。
在字符串數據的開頭存儲內容不會更改保留的字符串長度,因此為HOST_NAME_MAX
。
當從char指針創建字符串時,創建的std::string
對象將最多包含但不包括第一個NUL
字符( 0x00
)。 原因是C字符串不能包含NUL
因為第一個NUL
用於標記字符串的結尾。
考慮每種情況下您正在做什么。 在前一個代碼段中,您聲明了一個能夠容納HOST_NAME_MAX
-1個字符(空終止符為1個)的字符數組。 然后,您可以通過調用gethostname
將一些字符串數據加載到該緩沖區中,然后使用std::string::operator=
將其分配給一個const char *
的std::string
對象,從而打印出緩沖區的長度。 這樣做的效果之一是它將更改內部大小變量std::string
為緩沖區的strlen
,它不一定與HOST_NAME_MAX
相同。 調用std::string::length
只會返回該變量。
在后一種情況下,您使用的std::string
構造函數采用大小和初始字符來構造test
。 此構造函數將內部size變量設置為您傳入的任何大小,即HOST_NAME_MAX
。 然后,您將一些數據復制到std::string
的內部緩沖區中,這一事實與它的size變量無關。 與其他情況一樣,對length()
成員函數的調用僅返回大小HOST_NAME_MAX
而不管基礎緩沖區的實際長度是否小於HOST_NAME_MAX
。
正如@MattMcNabb在評論中提到的那樣,您可以通過以下方法解決此問題:
test.resize( strlen(test.c_str()) );
您為什么要這樣做? 與char緩沖區方法的一致性可能是一個原因,但是另一個原因可能是面向性能的。 在后一種情況下,你不僅直接設置該字符串的長度HOST_NAME_MAX
, 而且其容量(省略了SSO為簡潔起見),你可以找到在開始的242線的libstdc的std :: string實現++的 。 就性能而言,這意味着即使test
字符串中實際上僅包含25個字符,下次您追加到該字符串時(通過+=
, std::string::append
等),它的性能仍然更高因為內部大小和內部容量相等,所以不必重新分配和增長字符串( 如此處所示) 。 但是,按照@MattMcNabb的建議,字符串的內部大小減小到實際有效負載的長度,同時保持容量與以前相同,並且避免了幾乎立即重新增長和重新復制字符串, 如圖所示在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.