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