C:如何将字符串转换为长整数格式的整数
Posted
技术标签:
【中文标题】C:如何将字符串转换为长整数格式的整数【英文标题】:C: How do I convert a string to int which will be in long int format 【发布时间】:2021-05-27 20:19:16 【问题描述】:我想将字符串 "12341234123412341234"
转换为 int,但是当我使用 atoi 时它返回 -1
char n[100] = "12341234123412341234";
printf("%d",atoi(n));
返回-1
如果我使用%ld
或%lld
它会返回一个垃圾值
char n[100] = "12341234123412341234";
printf("%lld",atoi(n)); //even if i use %ld it returns the same value
返回4294967295
【问题讨论】:
【参考方案1】:你要的函数是strtol
:
char n[100] = "12341234123412341234";
printf("%llu", strtoull(n, NULL, 10));
【讨论】:
它返回9223372036854775807
,我希望它返回12341234123412341234
int。
@CLOUD1015 啊,long
的值太大了,unsigned long long
不行,所以用strtoull
。【参考方案2】:
atoi
返回一个int
。在典型的 32 位或 64 位架构(使用 32 位 int
)上可以具有的最大值是 2147483647
。因此,在您的情况下,atoi
会返回什么取决于实现,但我们可以相当肯定它不会是 12341234123412341234
试图告诉printf
传递给它的参数是long
或long long
使用"%ld"
或"%lld"
也不起作用。它不会改变atoi
返回int
的事实,这就是传递给printf
的内容。因此,除了来自atoi
的返回值不是您想要的之外,您还在对传递给printf
的数据类型撒谎。对你的电脑撒谎没有什么好处。除了long
和long long
通常也不能保存12341234123412341234
的值。
uint64_t
的整数类型可以保存从 0
到 18446744073709551615
的值,这应该适用于您的情况。通常uint64_t
与unsigned long long
相同,您可以使用strtoull
来解析:
const char *n = "12341234123412341234";
char *end;
unsigned long long v = strtoull(n, &end, 10);
printf ("%llu\n", v);
当然,如果字符串 n
来自不受信任的来源,一个健壮的程序应该检查指针 end
是否有解析错误。
请参阅man strtoull
了解更多信息。
您还应该查看INT_MAX
和ULLONG_MAX
(以及其他*_MAX
)以了解您的架构。
【讨论】:
以上是关于C:如何将字符串转换为长整数格式的整数的主要内容,如果未能解决你的问题,请参考以下文章