C++ 在不使用 std::from_chars 的情况下将计数的 char const * 数据转换为 double
C++ convert counted char const * data to double without using std::from_chars
此问题是一个编程问题,即使它特定于 Raspberry Pi。如果社区认为我应该将其移至 Pi 特定的 Stack Exchange,我可以这样做。
也就是说,问题的根本原因是在 Pi 上使用 std::from_chars()
和 gcc 时似乎无法支持非整数类型。以下 mcve 显示了问题:
#include <charconv>
int main()
{
char const *str = "1.23";
int i = 0;
std::from_chars_result result = std::from_chars(str, str + 4, i);
double d = 0.0;
result = std::from_chars(str, str + 4, d);
return 0;
}
在 Windows 10 上使用 MSVC 可以很好地编译,但是当我尝试在 Pi 上使用 gcc gcc (Raspbian 8.3.0-6+rpi1) 8.3.0
时会生成以下错误,如果它使一个 运行 buster-lite区别。
g++ -c -std=c++17 check.c
check.c: In function ‘int main()’:
check.c:9:45: error: no matching function for call to ‘from_chars(const char*&, const char*, double&)’
result = std::from_chars(str, str + 4, d);
之所以选择 std::from_chars
如此自然,是因为在生产版本中,我使用的是 std::string_view
,因此无法保证数据以 NUL 结尾。因此,像 strtod()
这样的东西可能会离开数据的末尾,并产生(最好的情况)错误解析或(最坏的情况)程序崩溃。
我还有哪些其他选择?
选项(不在我的脑海中;肯定还有其他选项):
- 使用更现代的 gcc 版本(特别是更现代的 libstdc++)。
- 将数据复制到
std::string
,然后根据对该字符串调用 c_str
的结果调用 strtod
(提供空终止符)。
- 手动将数据复制到某个数组中,并在其末尾填充一个空值,然后调用
strtod
。
此问题是一个编程问题,即使它特定于 Raspberry Pi。如果社区认为我应该将其移至 Pi 特定的 Stack Exchange,我可以这样做。
也就是说,问题的根本原因是在 Pi 上使用 std::from_chars()
和 gcc 时似乎无法支持非整数类型。以下 mcve 显示了问题:
#include <charconv>
int main()
{
char const *str = "1.23";
int i = 0;
std::from_chars_result result = std::from_chars(str, str + 4, i);
double d = 0.0;
result = std::from_chars(str, str + 4, d);
return 0;
}
在 Windows 10 上使用 MSVC 可以很好地编译,但是当我尝试在 Pi 上使用 gcc gcc (Raspbian 8.3.0-6+rpi1) 8.3.0
时会生成以下错误,如果它使一个 运行 buster-lite区别。
g++ -c -std=c++17 check.c
check.c: In function ‘int main()’:
check.c:9:45: error: no matching function for call to ‘from_chars(const char*&, const char*, double&)’
result = std::from_chars(str, str + 4, d);
之所以选择 std::from_chars
如此自然,是因为在生产版本中,我使用的是 std::string_view
,因此无法保证数据以 NUL 结尾。因此,像 strtod()
这样的东西可能会离开数据的末尾,并产生(最好的情况)错误解析或(最坏的情况)程序崩溃。
我还有哪些其他选择?
选项(不在我的脑海中;肯定还有其他选项):
- 使用更现代的 gcc 版本(特别是更现代的 libstdc++)。
- 将数据复制到
std::string
,然后根据对该字符串调用c_str
的结果调用strtod
(提供空终止符)。 - 手动将数据复制到某个数组中,并在其末尾填充一个空值,然后调用
strtod
。