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
,但问题仍然存在。
答案 0 :(得分:18)
C ++ 17规范没有声明to_chars
添加了NUL终结符:
所有名为
to_chars
的函数都会通过连续填充范围[value
,first
)将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
也没有(插入值时)。