c_str() vs data():C++11前后差异与空终止符
请解释 std::string 的 c_str() 和 data() 方法的区别,C++11 前后两者行为有何变化?data() 返回的字符串是否保证以 '\0' 结尾?
回答
小字辈
C++11 之前:
c_str():返回以\0结尾的 C 风格字符串。data():返回原始字符数组指针,不保证以\0结尾(返回的内部缓冲区可能无终止符)。
C++11 之后:
data()与c_str()行为一致:都返回以\0结尾的字符数组。C++11 要求std::string实现保证内部存储以\0结尾。
实际差异:
- 语义上
c_str()强调返回 C 兼容字符串,data()强调返回底层数据指针。 data()有非 const 重载(C++17):char* data()返回可修改的底层缓冲区。- 修改
data()返回的缓冲区是未定义行为,除非字符串本身是 const 的。
最佳实践:调用 C API 时用 c_str();需要获取底层数组时用 data();调用带 const 的 C API 两者均可。