【问题标题】:Is C++17 std::to_chars adding a null terminator?C++17 std::to_chars 是否添加了一个空终止符?
【发布时间】:2018-08-12 09:48:49
【问题描述】:

http://en.cppreference.com/w/cpp/utility/to_chars

参考并没有说明这一点,但这个例子(对我来说)显然使用了一个以 null 结尾的字符串,否则它怎么知道在哪里结束,因为 std::array::data 只返回一个指针。

#include <iostream>
#include <charconv>
#include <array>

int main()
{
    std::array<char, 10> str{};
    std::to_chars(str.data(), str.data()+str.size(), 42);
    std::cout << str.data();
}

不幸的是,我无法自己测试它,因为 AFAIK 还没有编译器支持它: https://en.cppreference.com/w/cpp/compiler_support

编辑: 忘记了str 是用零初始化的,但是问题仍然相关。

【问题讨论】:

  • 来自 cppreference 链接:"成功时,返回一个 to_chars_result 类型的值,使得 ec 等于值初始化的 std::errc 并且 ptr 是写入的字符。请注意,字符串不是以 NUL 结尾的。" [我的粗体字]

标签: c++ c++17 string-conversion


【解决方案1】:

C++17 规范没有说明to_chars 添加了 NUL 终止符:

所有名为to_chars 的函数通过连续填充范围 [first, last) 将value 转换为字符串,其中 [first, last) 需要是有效范围。如果返回值的成员ec在转换为bool时为false,则表示转换成功,成员ptr是写的字符。否则,成员ec 的值为errc::value_too_large,成员ptr 的值为last,范围[first,last) 的内容未指定。

在该段落或专门定义单个 to_chars 重载的行为的段落中没有说明 NUL 终止符。因此,它不写一个。

只要to_chars 生成的字符不超过 9 个,该示例就可以工作。由于str 被初始化为所有NUL 字符,任何未写入str 的内容都将保留为NUL 字符。


此外,提出它的原始论文 P0067R0 明确指出 to_chars 函数不应以 NUL 终止字符串。

【讨论】:

  • 你说得对,我忘了这个数组是用零初始化的。
【解决方案2】:

如 cpprefrence 所述(您的第一个链接)

值被转换为字符串,就像在默认(“C”)语言环境中通过 std::sprintf 一样。

所以不,它不会添加空终止符,因为 sprintf 也不会(插入值时)。

【讨论】:

  • 这个例子来自cppreference,它不会错过&lt;charconv&gt; header :D
  • 抱歉监督了 :D。已更正。
  • cpprefrence 链接不再包含这句话。除此之外 - sprintf 确实空终止目标缓冲区。
猜你喜欢
  • 2023-03-23
  • 2021-11-06
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多