簡體   English   中英

不知道為什么使用字符串或char時會得到不同的長度

[英]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.

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