2013-07-22 49 views

回答

4

std::string非常多std::vector:它有一個長度屬性,並不是以C++ 03結尾的零;在C++ 11'std :: string'似乎被終止,但我覺得'std :: string'作爲字符的'std :: vector'並不僅僅是一個終止的緩衝區。

+3

此外,'c_str()'可用於獲取C型空字符結束的字符串。 – Naveen

+4

它不像「不」那麼簡單。在'[begin(),end())'之間不需要終止,但是'c_str()'和'data()'返回一個指向空終止數組的指針。 – juanchopanza

+0

@juanchopanza僅限於C++ 11。 –

-1

的std :: string ::數據

將指針返回到包含字符的相同序列組成的字符串對象的值的字符的數組。

訪問data()+ size()處的值會產生未定義的行爲:不能保證null字符終止由此函數返回的值指向的字符序列。有關提供這種保證的函數,請參閱string :: c_str。

程序不得更改此序列中的任何字符。

+4

在C++ 11中,'data()'和'c_str()'實際上是相同的 - 兩者都將以NULL結尾。 –

+1

+1 @CoryNelson謝謝,Cx11 std :: string :: data:返回一個數組的指針,該數組包含一個表示字符串對象當前值的以空字符結尾的字符序列(即C字符串)。 此數組包含組成字符串對象的值的相同字符序列,並在末尾加上附加的終止空字符('\ 0')。 指針返回指向字符串對象當前使用的內部數組,以存儲符合其值的字符。 string :: data和string :: c_str都是同義詞,並返回相同的值。 –

9

在C++ 03中,std :: string不需要存儲在NUL終止的緩衝區中,但是如果調用c_str()它將返回一個指向NUL終止的緩衝區的指針。該緩衝區可以在c_str()調用中合法創建和/或終止。

在C++ 11,所有std::string實例被終止,所以data()還解決一個NUL封端的緩衝器,並且甚至s[s.size()]具有良好定義的含義返回到終止NUL的參考。

+0

因此,它歸結爲你想與哪種語言接口?如果您需要與C函數接口,請使用c_str()來獲取指向以空字符結尾的字符數組的指針。如果您需要與另一個C++函數進行交互,那麼可能需要std :: string,但不能保證以null結尾(如果您需要迎合C++ 03)。 – Keplerian

+1

@Keplerian:當通過'const char *'調用需要ASCIIZ緩衝區的C函數時,確實會使用'c_str()',並可能使用'&s [0],s.size()'傳遞一個(non- const)'char *'和'size_t'到計劃修改緩衝區內容的C函數 - 但在C++ 11之前,它不能保證NUL終止,你必須首先檢查'!s.empty()'以避免' &s [0]'未定義的行爲。對於期望'std :: string'的其他C++函數,你不應該向他們保證任何有關NUL終止的事情,因爲它們大概會使用'.size()','.end()'等。 –

+0

也[我的答案在這裏](http://stackoverflow.com/questions/347949/how-to-convert-a-stdstring-to-const-char-or-char/4152881#4152881)。 –