【问题标题】:Is wstring null terminated?wstring null 是否终止?
【发布时间】:2013-07-30 06:01:07
【问题描述】:

std::wstring 的内部结构是什么?包括长度吗?它是否为空终止?两者都有?

【问题讨论】:

标签: c++


【解决方案1】:

是否包括长度

是的。这是 C++11 标准要求的。

§ 21.4.4

size_type size() const noexcept;
1. 返回:字符串中当前类字符对象的数量。
2. 复杂性:恒定的时间。

但是请注意,这不知道 unicode。


是否为空终止

是的。 C++11 标准还要求std::basic_string::c_str 为 [0,size()] 的范围返回一个有效指针,其中my_string[my_string.size()] 将是有效的,因此是一个空字符。

§ 21.4.7.1

const charT* c_str() const noexcept;
const charT* data() const noexcept;
1. 返回:一个指针p 使得p + i == &operator[](i) 用于 [0,size()] 中的每个 i
2. 复杂性:恒定时间。
3. 要求:程序不得更改任何值 存储在字符数组中。

【讨论】:

  • 好吧,我通过阅读规范学习了 C#,我不妨对 C++ 做同样的事情。我在哪里可以得到它的副本?
  • @JonathanAllen 我不会从标准中学习,它充满了标准,所以很难阅读。但是,您可以找到 C++14 CD here,以及多个草案和标准化过程。
  • 我不知道你在比较什么,但你刚刚发布的内容比 MSDN 上的文档更容易理解。
  • @JonathanAllen 如果你想要一个好的可读文档,我绝对支持this one
  • 对于快速参考来说还不错,但是当我第一次学习某些东西时,我更喜欢看书。尤其是涵盖了所有令人讨厌的细节。
【解决方案2】:

我们不知道。这完全取决于实施。 (至少在 C++03 之前 - 显然 C++11 要求内部缓冲区以 0 结尾。)如果您使用的是开源的,您可以查看 C++ 标准库实现的源代码。


除此之外,如果它是 NUL 终止的 并且 它也存储了明确的长度,我会发现它是合乎逻辑的。这很好,因为返回长度一个有效的 C 字符串需要恒定的时间:

size_t length()
{
    return m_length;
}

const wchar_t *c_str()
{
    return m_cstr;
}

如果它没有存储明确的长度,那么size() 将不得不将字符数直到O(n) 中的NUL,如果可以避免的话,这将是一种浪费。

但是,如果内部缓冲区不是以 NUL 结尾的,而只是存储了长度,那么创建一个适当的以 NUL 结尾的 C 字符串将是乏味的:该字符串必须重新分配其存储空间并追加0(并且重新分配是一项昂贵的操作),或者它必须复制整个缓冲区,这又是一个O(n) 操作。

(警告:无耻的自我推销——在我目前正在从事的一个 C 语言项目中,我正是采用这种方法来实现灵活的字符串对象。)

【解决方案3】:

basic_string(wstring 是 typedef)不需要终结符。

是的,它管理自己的长度。

如果您需要一个以 null 结尾的(也称为 C 字符串)版本的 string/wstring,请调用 c_str()。但它可以在其中包含一个空字符,在这种情况下,几乎每个处理 C 字符串的 C 函数都将无法看到整个字符串。

【讨论】:

  • 恐怕这不能回答问题。 OP 正在询问字符串的内部实现,他大概非常了解.c_str() 成员函数并且知道为什么以及何时使用它。另外,希望大家了解C标准库中的宽字符串处理函数,如wstrlen()
  • 其实我是一名记者,试图写关于 Platform::StringReference 如何与 wchar_t* 和 wstring 一起工作的文章。显然,StringReference“需要一个空终止类型的字符串(wchar_t* 或 wstring)”才能在不创建副本的情况下工作。或者也许他的意思是“需要一个(wchar_t * 类型的空终止字符串)或wstring”。可惜口语没有括号。
  • 是的,我没有回答他的问题,选择的答案给出了与我完全相同的三个答案,一小时后。也许我应该只写一篇长文而不解决问题,或者只是引用标准而误解它。
猜你喜欢
  • 2017-05-29
  • 2021-09-28
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多