【问题标题】:Does C++ null-terminate a std::string? [duplicate]C++ 是否以空值终止 std::string? [复制]
【发布时间】:2020-12-22 09:11:42
【问题描述】:

可以为 C++ const 字符串调用 .c_str()。

为了有效地实现这一点,这意味着它必须在内部存储一个额外的空字符。 (否则,.c_str() 调用需要复制或修改数据)

因此,即使在调用 c_str() 之前,C++ 字符串也始终以空值结尾。

对吗?还是错了?

【问题讨论】:

  • 链接问题中接受的答案有点过时了。更好的 - stackoverflow.com/a/11752722/4074081: In C++11 and later, mystring.c_str() is equivalent to mystring.data() is equivalent to &mystring[0], and mystring[mystring.size()] is guaranteed to be '\0'.

标签: c++ string


【解决方案1】:

是的,从 C++11 开始就需要它。

对于std::string ss[s.size()] 必须为 0。(请注意,尝试修改该元素的行为未定义。)

请注意,s 允许在最终终止符之前包含 0。在这方面,它不同于普通的 C 样式字符串。

参考:https://en.cppreference.com/w/cpp/string/basic_string

【讨论】:

  • 谢谢。仅供参考,您可能有一个链接可以确认这一点吗?
  • @CaptainCodeman:我添加了一个参考。 cppreference 几乎是标准的代理,并且更易于阅读。
  • 谢谢,非常感谢。
【解决方案2】:

在 C++11 之前,字符串的数据缓冲区不需要 以空值结尾,甚至是连续的。允许c_str() 的实现将数据复制到单独的连续空终止缓冲区。然而,在实践中,没有任何实现可以真正做到这一点,数据缓冲区通常是连续的并且为提高效率而以空值终止。

自 C++11 起,数据缓冲区要求连续且以空值终止,特别是为了保持 c_str()data() 方法的实现简单。

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2011-08-29
    • 2019-08-03
    • 2018-11-22
    • 2011-06-09
    相关资源
    最近更新 更多