如何使用 std:from_chars 在 C++17 中从字符串转换为 int/float

How to convert from string to int/float in C++17 with std:from_chars

本文关键字:转换 字符串 int float C++17 std 何使用 from chars      更新时间:2023-10-16

什么是使用 std::from_chars 的好例子 (C++17(

  • 从字符序列转换为 int
  • 从字符序列转换为浮点数

Open-Std std::from_chars

这取决于您究竟要做什么,这对于了解您希望如何处理返回值非常重要。

如果要以不同的方式处理不同的可能错误类型,请将std::from_chars_resultec成员与std::errc::invalid_argumentstd::errc::out_of_range的值进行比较。如果你只关心成功/失败,你会把它投射到bool(根据P0067R5,在成功的情况下,当投射到bool时,ec的值将被false(。如果您关心正在解析的整个字符串,那么您还需要检查ptr成员。

例如,下面的函数会将 C 字符串解析为std::optional<int>,如果发生错误或整个字符串未解析(例如,如果您尝试解析类似"123.45"的内容(,则该值为空。

auto tryParseInt(const char* src)->std::optional<int>
{
const char* end = std::strchr(src, 0); // find the terminating null
int parsed;
std::from_chars_result result = std::from_chars(src, end, parsed);
return (!(bool)result.ec && result.ptr == end)
? std::optional<int>{ parsed }
: std::nullopt;
}

有关使用int变体的简单示例:

char input[] = "foo 123 bar";
int value;
auto result = std::from_chars(input + 4, input + 6, value);  // input[4] to input[6] should be a three-digit integer
if (result.ec == std::errc::invalid_argument)
{
std::cout << "Unsuccessful parsen";
}
else
{
std::cout << "Successful parse, value is " << value << 'n';
}

重要的是要注意,由于value不是由我初始化的,并且在失败时它将保持不变,因此只有在字符串段解析成功时才能使用它。