【问题标题】:Does the Standard Define Common Bases?标准是否定义了公共基础?
【发布时间】:2018-10-18 18:18:09
【问题描述】:

strtol,例如,将基数作为其最后一个参数

我发现在我的整个代码中传递幻数 10 并不吸引人。标准中是否已经定义了十进制基数?

【问题讨论】:

  • strtol 是一个 C 函数,为什么 C++ 会为它定义一些东西?
  • @Slava 也许是因为它是 C++ 标准库的一部分。
  • @Slava 我知道我无法就任何与 C++ 相关的问题与您争论,但我想恭敬地指出,这似乎是由从char* 中提取数字的标准。
  • 使用较新的 C++11 函数解决该问题:en.cppreference.com/w/cpp/string/basic_string/stol
  • @NathanOliver 我发现 string 的构造不可取:(

标签: c++ decimal standards base strtol


【解决方案1】:

我认为没有任何标准的基本定义可用于strtol。但是,还有其他转换函数,它们将 10 作为 base 的默认参数,例如适用于 std::strings 的 std::stoi,以及适用于 const char*s 的新 std::from_chars

【讨论】:

    【解决方案2】:

    我发现在我的整个代码中传递神奇的数字 10 并不吸引人。

    您可以将0 用于base 并让实现推导出基数。

    auto v1 = strtol("101", nullptr, 0); // base is deduced to be 10
    auto v2 = strtol("078", nullptr, 0); // base is deduced to be 8
    auto v3 = strtol("0xF09", nullptr, 0); // base is deduced to be 16
    

    【讨论】:

      【解决方案3】:

      没有为strtol 定义十进制默认值。您可以创建自己的代理功能,例如:

      long int strtolBase10(const char *nptr, char **endptr)
      {
        return strtol(nptr, endptr, 10);
      }
      

      值得注意的是,如果您使用特殊值 0 作为基本参数,strtol 将解析为十进制,除非字符串以 '0x' 或 '0X' 开头(它将以 base 16 解析)或以'0'(它将以 8 为基数解析)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多