如何使用 std:from_chars 在 C++17 中从字符串转换为 int/float
How to convert from string to int/float in C++17 with std:from_chars
什么是使用 std::from_chars 的好例子 (C++17(
- 从字符序列转换为 int
- 从字符序列转换为浮点数
?
Open-Std std::from_chars
这取决于您究竟要做什么,这对于了解您希望如何处理返回值非常重要。
如果要以不同的方式处理不同的可能错误类型,请将std::from_chars_result
的ec
成员与std::errc::invalid_argument
或std::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
不是由我初始化的,并且在失败时它将保持不变,因此只有在字符串段解析成功时才能使用它。
相关文章:
- wcstombs_s(),转换字符串的长度
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 无法转换字符串插入函数的参数
- 转换字符串向量:基于先前的值跳过元素
- 从中间器转换字符串不起作用,出了什么问题?
- 失败的证明转换字符串到枚举类
- 如何使用正则表达式和提升转换迭代器标记和转换 c 字符串
- 使用java jni时转换字符串类型
- 如何避免在转换字符串令牌流时重复istringstream构造
- 阿托伊未正确转换字符串
- C++,转换字符串,使连续下划线序列变为单个下划线
- 使用长算术转换字符串
- 转换字符串十进制数时的精度
- 将词法转换字符串提升为双精度
- 使用marshal_as函数转换字符串的性能
- C++不会从数据转换字符串
- 无论如何,在c++ /Qt中转换字符串到结构中的字段
- C++ 隐式类型转换字符串 -> int?
- 转换字符串到浮点数,c++实现
- 用于转换字符串大小写的函数