c++17中的std::from_chars

1
std::from_chars, std::from_chars_result

在头文件<charconv>定义

1
2
3
4
5
6
7
8
9
10
11
12
13
// (1)	(C++17 起)
std::from_chars_result from_chars(const char* first, const char* last, /*see below*/& value, int base = 10);
// (2) (C++17 起)
std::from_chars_result from_chars(const char* first, const char* last, float& value, std::chars_format fmt = std::chars_format::general);
// (3) (C++17 起)
std::from_chars_result from_chars(const char* first, const char* last, double& value, std::chars_format fmt = std::chars_format::general);
// (4) (C++17 起)
std::from_chars_result from_chars(const char* first, const char* last, long double& value, std::chars_format fmt = std::chars_format::general);
// (5) (C++17 起) 辅助类型
struct from_chars_result {
const char* ptr;
std::errc ec;
};

按照后述模式分析字符序列 [first,last) 。若无字符匹配模式或若按照分析匹配字符获得的值不能以 value 的类型表示,则不修改 value ,否则将匹配模式的字符转译成算术值的文本表示,并将值存储于 value 。

  • 1) 整数分析函数:期待等同于 std::strtol 于默认( “C” )本地环境所使用者相同的模式,并给定非零整数底,除了
    • 对底 16 不识别 “0x” 或 “0X” 前缀
    • 仅识别负号(不识别正号),而且只针对 value 的有符号整数类型。
      库为所有有符号和无符号整数类型和 char 提供重载,这些类型是参数 value 的被引用类型。
  • 2-4) 浮点分析函数:期待期待等同于 std::strtod 于默认( “C” )本地环境所使用者相同的模式,除了
    • 不识别指数外的正号(在起始位置只允许出现负号)
    • 若 fmt 设置了 std::chars_format::scientific 而无 std::chars_format::fixed ,则要求指数部分(否则可选)
    • 若 fmt 设置了 std::chars_format::fixed 而无 std::chars_format::scientific ,则不允许可选的指数部分
    • 若 fmt 为 std::chars_format::hex ,则不允许前缀 “0x” 或 “0X” (字符串 “0x123” 分析为值 “0” 和未分析的剩余 “x123” )。
    • 任何情况下,按照 std::round_to_nearest 舍入后,结果值是至多二个最接近匹配模式的字符串的值的浮点值之一。
  • 5) 返回值类型(见后述返回值)。 std::from_chars_result 无基类或 ptr 、 ec 及隐式声明的特殊成员函数以外的成员。

参数

first, last - 要分析的合法字符范围
value - 存储被分析值的输出参数,若分析成功
base - 使用的整数基底: 2 与 36 间的值(含上下限)。
fmt - 使用的浮点格式, std::chars_format 类型的位掩码

返回值

成功时,返回 from_chars_result 类型的值,其 ptr 指向首个不匹配模式的字符,或若所有字符皆匹配则指向拥有等于 last 的值,其 ec 被值初始化。

若无可匹配的模式,则返回 from_chars_result 类型的值,其 ptr 等于 first 且 ec 等于 std::errc::invalid_argument 。不修改 value 。

若模式匹配,但被分析值不在 value 的类型所表示的范围内,则返回 from_chars_result 类型的值,其 ec 等于 std::errc::result_out_of_range 且 ptr 指向首个不匹配模式的字符。不修改 value 。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <charconv> 
#include <iostream>
#include <array>

int main()
{
std::array<char, 10> sa{ "123" };
std::array<char, 10> sb{ "123.456" };
std::array<char, 10> sc{ ".123" };
int ia{ -1 }, ib{ -1 }, ic{ -1 };
auto iaec = std::from_chars(sa.data(), sa.data() + sa.size(), ia);
auto ibec = std::from_chars(sb.data(), sb.data() + sb.size(), ib);
auto icec = std::from_chars(sc.data(), sc.data() + sc.size(), ic);
if (std::errc::invalid_argument == icec.ec)
{
std::cout << "error:" << icec.ptr << std::endl;
}
std::cout << "ia:" << ia << "\tib:" << ib << "\tic:" << ic << std::endl;
double da{ -1 }, db{ -1 }, dc{ -1 };

auto daec = std::from_chars(sa.data(), sa.data() + sa.size(), da);
auto dbec = std::from_chars(sb.data(), sb.data() + sb.size(), db);
auto dcec = std::from_chars(sc.data(), sc.data() + sc.size(), dc);

std::cout << "da:" << da << "\tdb:" << db << "\tdc:" << dc << std::endl;

return 0;
}