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]
