【问题标题】:parsing integer in exponential notation from string从字符串中以指数表示法解析整数
【发布时间】:2013-07-02 09:42:20
【问题描述】:

显然std::stoi 不接受以指数表示法表示整数的字符串,例如"1e3" (= 1000)。有没有一种简单的方法可以将这样的字符串解析为整数?有人会认为,由于这种表示法在 C++ 源代码中有效,标准库有一种方法来解析它。

【问题讨论】:

    标签: c++ string integer std


    【解决方案1】:

    您可以使用stod(参见docs)来执行此操作,首先将其解析为双精度。 在回退时要注意精度问题...

    #include <iostream>   // std::cout
    #include <string>     // std::string, std::stod
    
    int main () {
       std::string text ("1e3");
       std::string::size_type sz;     // alias of size_t
       double result = std::stod(text,&sz);
       std::cout << "The result is " << (int)result << std::endl; // outputs 1000
       return 0;
     }
    

    【讨论】:

    • +1 但如果结果的幅度太大,则保留 (int)result 为 UB。
    • 是的,我应该强调这一点。
    【解决方案2】:

    有人会认为,由于这种表示法在 C++ 源代码中有效,标准库有办法解析它。

    库和编译器无关。此语法在 C++ 中有效的原因是该语言允许您将 double 类型的表达式分配给整数变量:

    int n = 1E3;
    

    double 表达式(即double 类型的数字文字)分配给整数变量。

    知道这里发生了什么,您应该能够轻松识别标准 C++ 库中满足您需要的函数。

    【讨论】:

      【解决方案3】:

      例如,您可以使用标准流将其读取为双精度

      double d;
      std::cin >> d; //will read scientific notation properly
      

      然后将其转换为 int,但显然 double 可以表示比 int 更多的值,所以要小心。

      【讨论】:

        【解决方案4】:

        将指数符号发送到std::stoi 会经常溢出,而 C++ 中的整数溢出是未定义的行为。

        您需要自己构建,以便根据您的特定要求定制边缘案例。

        我倾向于不走std::stod 路线,因为如果double 的组成部分不能由int 表示,则从doubleint 的转换是未定义的行为。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-03
          • 2010-09-21
          • 2021-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          相关资源
          最近更新 更多