首页 > 后端开发 > C++ > 正文

C 11 的 `string::c_str()` 仍然保证以 Null 结尾的字符串吗?

Mary-Kate Olsen
发布: 2024-10-27 15:35:02
原创
343 人浏览过

 Does C  11's `string::c_str()` Still Guarantee a Null-Terminated String?

C 11 的 string::c_str() 函数不再以 Null 结尾吗?

在 C 中, basic_string 类提供了各种方法访问其字符。其中一个方法 c_str() 自 C 11 以来一直是混乱的根源。在 C 11 之前,c_str() 负责返回表示字符串内容的以 null 结尾的字符数组。

但是,在 C 11 中,basic_string::c_str() 的定义已更改。它现在被定义为与 basic_string::data 相同,后者又返回一个指向字符串内部字符缓冲区开头的指针。这提出了一个问题:此更改是否意味着 c_str() 不再保证以 null 结尾的字符串?

答案:字符串内部需要以 null 结尾的缓冲区

这个问题的答案是否定的。尽管 C 11 中发生了变化,字符串仍然需要在内部使用空终止缓冲区。这从 C 标准中的operator[]方法(21.4.5)的定义中可以明显看出:

Requires: pos <= size().
Returns: *(begin()+pos) if pos < size(), otherwise a reference to an object of type T with value charT(); the referenced value shall not be modified.
登录后复制

c_str() 是根据operator[]定义的:

Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()].
登录后复制

由于 c_str() 和 data 都需要 O(1) 操作,因此实际上强制实现使用以 null 结尾的缓冲区。此外,operator[] 的返回值要求可确保 c_str() 返回指向以 null 结尾的缓冲区的指针。因此,尽管 C 11 中发生了变化,c_str() 仍然提供以 null 结尾的字符串。

以上是C 11 的 `string::c_str()` 仍然保证以 Null 结尾的字符串吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!