c_str()始终返回以'\0'结尾的C风格字符串,data()仅保证前size()字节为内容但不保证末尾有'\0';C++11明确二者行为差异,C++17强化非空终止语义并支持string_view。

data() 返回内部字符数组的指针,不保证末尾有 '\0';c_str() 也返回指针,但强制保证以 '\0' 结尾。
返回内容是否带空终止符
这是最根本的区别:
-
c_str()始终返回一个以'\0'结尾的 C 风格字符串(null-terminated),可直接传给printf、strlen、open()等 C 函数。 -
data()在 C++11 之前行为未定义(可能不以'\0'结尾);C++11 起明确要求data()返回的指针指向的前size()个字节是字符串内容,但不保证第size()个字节是'\0'。不过实践中多数实现仍会预留空字符(尤其在非 short-string 优化情况下),但你不该依赖它。
C++11/17 中的关键变化
C++11 是分水岭:
- C++11:首次明确定义
data()行为 —— 它与c_str()返回相同地址,且data() + size()处的字节**不一定**是'\0'(即不要求 null-termination)。但标准允许实现让data()[size()] == '\0',只是你不能假设它一定成立。 - C++17:进一步强化了“不保证 null-termination”这一语义,并新增了
std::string_view,其构造函数接受data(), size()形式,正体现了对非 null-terminated 字符序列的支持。
什么时候该用哪个?
看调用目标是否需要 '\0':
立即学习“C++免费学习笔记(深入)”;
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~