【问题标题】:C: How do I convert a string to int which will be in long int formatC:如何将字符串转换为长整数格式的整数
【发布时间】: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

【问题讨论】:

    标签: c string integer atoi


    【解决方案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 传递给它的参数是longlong long 使用"%ld""%lld" 也不起作用。它不会改变atoi 返回int 的事实,这就是传递给printf 的内容。因此,除了来自atoi 的返回值不是您想要的之外,您还在对传递给printf 的数据类型撒谎。对你的电脑撒谎没有什么好处。除了longlong long 通常也不能保存12341234123412341234 的值。

    uint64_t 的整数类型可以保存从 018446744073709551615 的值,这应该适用于您的情况。通常uint64_tunsigned 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_MAXULLONG_MAX(以及其他*_MAX)以了解您的架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多