C ++ 17 std :: to_chars是否添加了一个空终止符?

时间:2018-03-04 18:07:03

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

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

编辑: 忘了用{0}初始化str,但问题仍然存在。

2 个答案:

答案 0 :(得分:18)

C ++ 17规范没有​​声明to_chars添加了NUL终结符:

  

所有名为to_chars的函数都会通过连续填充范围[valuefirst)将last转换为字符串,其中[first,{{ 1}})必须是有效范围。如果返回值的成员last使得转换为ec时的值为bool,则转化成功且成员false为 - 所写字符的过去指针。否则,成员ptr的值为ec,成员errc::value_too_large的值为ptr,内容范围为[last,{{1 }})未指定。

在该段落或专门定义个别first重载行为的段落中,没有任何关于NUL终结符的说明。因此,它不会写一个。

该示例有效,只要last不会产生超过9个字符。由于to_chars初始化为所有NUL字符,因此未写入to_chars的任何内容都将保留为NUL字符。

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

答案 1 :(得分:1)

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

  

将值转换为字符串,就像在默认情况下(&#34; C&#34;)区域设置中的std :: sprintf一样。

所以没有它没有添加空终止符,因为create_project也没有(插入值时)。