2016-04-01 97 views
1

我的問題起因於的libstdc basic_string.h讀取功能長度()和尺寸()的註釋++,即分佈式與Ubuntu 14.04:儘管字符串有空終止字符,std :: string的長度是否一致?

下面的註釋的狀態:

返回數字字符串中的字符,不包括任何空終止符。

對於我來說,這個評論是混亂的情況下,字符串只包含空終止字符,尤其是考慮如何傳統的strlen工作,我擔心編譯器可能會實現字符串,他們不返回大小(),但長度由char_traits :: length()確定。

雖然很明顯,字符串長度是已知的而不需要空終止字符,但傳統字符串的長度的概念與容器的長度不同。我擔心,這可能會在某個時候發生了變化,我想知道在如下面的代碼代碼的風險...

std::string header(4, char{}); 
assert(header.length() == 4); 

...不是完全跨平臺。

我假設它(的問題),必須持有有效的,而且我的假設是從這個reference

+1

是的,它符合標準。 – Lingxi

+0

可能是一個重複http://stackoverflow.com/questions/12285060/strange-behaviour-of-string-length-function-wrt-null-character –

回答

3

其中字符串只包含空終止字符

那些不是「空終止字符「,因爲它們不是終止的字符串,它們是它的一部分。它們是空字符,但不是空終止。

您看到的行爲由標準保證。你告訴string要創建一個由四個空字符組成的字符串,這就是你所得到的。

在編譯器之間或者標準的修訂之間是不可移植的,這是一件荒謬的事情。它總是保證。

我的問題也出現,因爲這是與strlen的傳統行爲不一致,char_traits ::長度()

這是無關緊要的,因爲char*不知道它的長度。 A std::string

我將更改libstdC++頭中的註釋,使您感到困惑,使其更清晰。

+0

我不認爲它完全不相關,雖然承認我沒有閱讀例如較老的標準(例如C++ 98)的確切細節。爲了一致起見,我可以想象舊版標準或編譯器可能已經這樣做了。在傳統意義上(最多爲空終止符)和容器意義上的size()使用長度(可能錯誤地)並不困難。 順便說一句,尊重 - 爲什麼要貶低我? –

+0

由於缺乏研究而被低估。在標準修訂版之間調用std :: string :: length()的含義也很愚蠢。 –

+0

我看了現有的標準。我的問題涉及與歷史考慮有關的風險。實際上,我的問題來自於查看glibcpp源代碼,並且發現代碼沒有執行評論所述的內容,提到空終止的評論是無關緊要的。我已經完成了研究...... –

相關問題