【问题标题】:How to convert a large integer from a string to a uint64_t?如何将大整数从字符串转换为 uint64_t?
【发布时间】:2015-07-09 19:04:55
【问题描述】:

我有一个大整数存储为字符串。我需要将其转换为整数 (uint64_t)。我尝试了stoi(),但在抛出std::out_of_range 的实例后它崩溃了。

字符串的最大值为 64 位整数值,最大值为 18,446,744,073,709,551,615(无符号长整数的最大值)。

除了(当然)手动之外,我该怎么做?

【问题讨论】:

  • @PaoloM,我不太明白。
  • @i_am_jorf,在this 链接中,转到第 4.1 节
  • @Paolo M - 我认为你的意思是你不能将每个整数都放入 64 位???
  • @franji1 是的,但是 OP 现在已经编辑了问题

标签: c++ string


【解决方案1】:

只要字符串包含一个小于std::numeric_limits<uint64_t>::max() 的数字,那么std::stoull() 就会执行您所期望的操作。

std::stoull() 函数是 C++11 中的新功能。)

【讨论】:

    【解决方案2】:

    您可以使用stringstream 来执行此操作。这在 C++98 中受支持(std::stoull() 函数是在 C++11 中添加的)。

    #include <stdint.h>
    #include <iostream>
    #include <sstream>
    using namespace std;
    
    uint64_t string_to_uint64(string str) {
      stringstream stream(str);
      uint64_t result;
      stream >> result;
      return result;
    }
    
    int main() {
      string str = "1234567891234567";
      uint64_t val = string_to_uint64(str);
      cout << val;
      return 0;
    }
    

    【讨论】:

    • 看看这个:cpp.sh/3dvx5 .... 不知何故,返回值与输入不同。
    【解决方案3】:

    一种方法是使用字符串流:

    unsigned long long val;
    std::istringstream stream(inputstring);
    stream >> val;
    

    根据this referenceoperator&gt;&gt; 至少有一个过载unsigned long long,这可能与uint64_t 相同。

    否则您可能必须手动执行此操作,例如将字符串拆分为可处理的部分,并通过与正确的基数相乘来连接结果。


    为了确定我现在会这样做:

    unit64_t to_uint64(std::string const & in) {
      static_assert(sizeof(unsigned long long) == sizeof(uint64_t), "ull not large enough");
      unsigned long long val = 0;
      std::istringstream stream(in);
      stream >> val;
      return val;
    }
    

    【讨论】:

    • 看看这个:cpp.sh/3d7ys .... 不知何故,返回值与输入不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2014-09-19
    • 2020-12-29
    相关资源
    最近更新 更多