【问题标题】:Convert a string into an integer - each representation将字符串转换为整数 - 每个表示
【发布时间】:2010-01-28 16:27:24
【问题描述】:

是否有函数或库可以将 C 中以char[] 形式给出的任何(默认、八进制、十六进制...)整数转换为unsigned long long int

例子:

1
1l
1ul
42e+10
0x2aLL
01234u
...

atoi 的 0x... 和后缀 u/l 存在一些问题。

【问题讨论】:

    标签: c integer


    【解决方案1】:

    strtoull 差不多。这将在后缀处停止,但由于您始终生成unsigned long long,因此您并不真正关心后缀。我也不相信它可以与42e+10 一起使用——尽管产生的值是一个整数,但 C 和 C++ 只为浮点数定义了“e”符号。

    除此之外,您需要/想要传递 0 作为转换基数,在这种情况下,它实现了通常的 C 约定,即前导 0 表示八进制,0x 表示十六进制,1-9 表示十进制。

    【讨论】:

      【解决方案2】:

      您可以使用 sscanf 并检查返回值以查看它是否做了有用的事情,例如:

      bool parseValue (const char *buffer, long &value)
      {
      if (sscanf(buffer,"%ld",&value)==1) return true;
      if (sscanf(buffer,"0x%lx",&value)==1) return true;
      ...
      return false;
      }
      

      您可以轻松地将更多种类的格式添加到此列表中。 要将其扩展到浮点值,请扫描浮点值中的缓冲区,然后将其强制转换或舍入为整数值,如下所示:

      bool parseValue (const char *buffer, long &value)
      {
      if (sscanf(buffer,"%ld",&value)==1) return true;
      if (sscanf(buffer,"0x%lx",&value)==1) return true;
      ...
      double d;
      if (sscanf(buffer,"%lf",&d)==1) {value=d; return true;}
      ...
      return false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-31
        • 2017-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 2015-01-14
        相关资源
        最近更新 更多