【发布时间】:2010-01-28 16:27:24
【问题描述】:
是否有函数或库可以将 C 中以char[] 形式给出的任何(默认、八进制、十六进制...)整数转换为unsigned long long int?
例子:
1
1l
1ul
42e+10
0x2aLL
01234u
...
atoi 的 0x... 和后缀 u/l 存在一些问题。
【问题讨论】:
是否有函数或库可以将 C 中以char[] 形式给出的任何(默认、八进制、十六进制...)整数转换为unsigned long long int?
例子:
1
1l
1ul
42e+10
0x2aLL
01234u
...
atoi 的 0x... 和后缀 u/l 存在一些问题。
【问题讨论】:
strtoull 差不多。这将在后缀处停止,但由于您始终生成unsigned long long,因此您并不真正关心后缀。我也不相信它可以与42e+10 一起使用——尽管产生的值是一个整数,但 C 和 C++ 只为浮点数定义了“e”符号。
除此之外,您需要/想要传递 0 作为转换基数,在这种情况下,它实现了通常的 C 约定,即前导 0 表示八进制,0x 表示十六进制,1-9 表示十进制。
【讨论】:
您可以使用 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;
}
【讨论】: