将字符串转换为整数 - 每个表示

发布于 2024-08-19 08:00:19 字数 224 浏览 1 评论 0原文

是否有函数或库可以将 C 中作为 char[] 给出的任何(默认、八进制、十六进制等)整数转换为 无符号长长整型

示例:

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

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

Is there a function or library that can convert any (default, octal, hex, ...) integer in C given as a char[] into an unsigned long long int ?

Examples:

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

atoi has some problems with 0x... and the suffixes u/l.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷离° 2024-08-26 08:00:19

strtoull 已经是最接近的了。这将在后缀处停止,但由于您总是生成一个 unsigned long long,因此您并不真正关心后缀。我也不相信它能与 42e+10 一起使用——尽管生成的值是一个整数,但 C 和 C++ 只为浮点数定义了“e”表示法。

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

strtoull is about as close as it gets. This will stop at the suffix, but since you're always producing an unsigned long long, you don't really care about the suffix anyway. I don't believe it will work with 42e+10 either -- although the value that produces is an integer, C and C++ only define the 'e' notation for floating point numbers.

Other than that, you need/want to pass 0 as the conversion base, in which case it implements the usual C convention that a leading 0 signals octal, 0x signals hexadecimal, and 1-9 signal decimal.

︶葆Ⅱㄣ 2024-08-26 08:00:19

您可以使用 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;
}

You could use sscanf and check the return value to see if it did something useful, e.g.:

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;
}

You can easily add more kinds of formats to this list.
To extend this for floating point values as well, scan the buffer in a floating point value then cast or round it to the integer value, like this:

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文