data和c_str
data()
和c_str()
都是用來獲取底層字符串的首地址的,但是在C++98中規定的是data()
返回的字符串不保證有結尾\0
,但是c_str()
返回的字符串保證有結尾\0
,也就是C++98標准在設計字符串的時候是想拋棄C風格的字符串語法的,但是在實際應用中,往往需要將C++的string
轉換為C風格的字符串const char*
。
這一點平常使用的時候沒問題,但如果想直接通過C風格的接口修改string
中的內容就麻煩了,因為&str[0]
返回的字符串並不保證有結尾'\0':
std::string str = "hello";
// 在C++98中是未定義行為
auto p = &str[0]
好在C++11標准中意識到了這一點,規定string
底層存儲的字符串直接采用C風格的字符串語法,所以data()
和c_str()
就變成了同義詞了:
std::string str = "hello";
// 在C++11中是正確的,p指向一個空字符串
auto p = &str[0]