C++17 std::to_chars 是否添加空终止符?
Is C++17 std::to_chars adding a null terminator?
http://en.cppreference.com/w/cpp/utility/to_chars
Reference 没有说明什么,但是这个例子(对我来说)清楚地使用了一个以 null 结尾的字符串,否则它怎么知道在哪里结束,因为 std::array::data
returns 只有一个指针。
#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
是用零初始化的,但是问题仍然相关。
如 cpprefrence 所述(您的第一个 link)
value is converted to a string as if by std::sprintf in the default ("C") locale.
所以不,它不会添加空终止符,因为 sprintf
也不会(插入值时)。
C++17规范没有说明to_chars
添加了一个NUL终止符:
All functions named to_chars
convert value
into a character string by successively filling the range [first
, last
) , where [first
, last
) is required to be a valid range. If the member ec
of the return value is such that the value, when converted to bool
, is false
, the conversion was successful and the member ptr
is the one-past-the-end pointer of the characters written. Otherwise, the member ec
has the value errc::value_too_large
, the member ptr
has the value last
, and the contents of the range [first
, last
) are unspecified.
该段或专门定义单个 to_chars
重载行为的段落中没有说明 NUL 终止符。所以就不写了。
只要 to_chars
不产生超过 9 个字符,该示例就可以工作。由于 str
被初始化为所有 NUL 字符,任何未写入 str
的内容都将保留为 NUL 字符。
此外,提出它的原始论文 P0067R0 明确指出 to_chars
函数不应 NUL-terminate 字符串。
http://en.cppreference.com/w/cpp/utility/to_chars
Reference 没有说明什么,但是这个例子(对我来说)清楚地使用了一个以 null 结尾的字符串,否则它怎么知道在哪里结束,因为 std::array::data
returns 只有一个指针。
#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
是用零初始化的,但是问题仍然相关。
如 cpprefrence 所述(您的第一个 link)
value is converted to a string as if by std::sprintf in the default ("C") locale.
所以不,它不会添加空终止符,因为 sprintf
也不会(插入值时)。
C++17规范没有说明to_chars
添加了一个NUL终止符:
All functions named
to_chars
convertvalue
into a character string by successively filling the range [first
,last
) , where [first
,last
) is required to be a valid range. If the memberec
of the return value is such that the value, when converted tobool
, isfalse
, the conversion was successful and the memberptr
is the one-past-the-end pointer of the characters written. Otherwise, the memberec
has the valueerrc::value_too_large
, the memberptr
has the valuelast
, and the contents of the range [first
,last
) are unspecified.
该段或专门定义单个 to_chars
重载行为的段落中没有说明 NUL 终止符。所以就不写了。
只要 to_chars
不产生超过 9 个字符,该示例就可以工作。由于 str
被初始化为所有 NUL 字符,任何未写入 str
的内容都将保留为 NUL 字符。
此外,提出它的原始论文 P0067R0 明确指出 to_chars
函数不应 NUL-terminate 字符串。