【问题标题】:Troubling converting string to long long in C麻烦在C中将字符串转换为long long
【发布时间】:2013-03-14 19:15:42
【问题描述】:

我无法让环礁函数在 c 中正确设置 long long 值。这是我的例子:

#include <stdio.h>

int main(void) {
    char s[30] = { "115" };
    long long t = atoll(s);

    printf("Value is: %lld\n", t);

    return 0;
}

这打印: 值为:0

这可行:

printf("Value is: %lld\n", atoll(s));

这是怎么回事?

【问题讨论】:

  • ideone.com/WntSUK 在IDEOne和我的电脑上都试过了,没问题?这是所有的代码吗?
  • 对我来说也一样。效果很好。
  • 什么编译器,哪个版本,有什么警告(-Wall in GCC)。
  • 您缺少#include &lt;stdlib.h&gt;,因此atoll 的结果可能会被截断。
  • 感谢保罗 R!这解决了问题。

标签: c string long-long


【解决方案1】:

首先,让我们回答您的问题:

#include <stdio.h>
#include <stdlib.h>  // THIS IS WHAT YOU ARE MISSING


int main(void) {
    char s[30] = { "115" };
    long long t = atoll(s);

    printf("Value is: %lld\n", t);

    return 0;
}

那么,让我们讨论并回答“为什么?”:

为了与非常旧的 C 程序(C89 之前)兼容,使用没有首先声明的函数只会从 GCC 生成警告,而不是错误(正如这里的第一条评论所指出的,也允许隐式函数声明在 C89 中,因此生成错误是不合适的,这是仅生成警告的另一个原因)。 但是这样一个函数的返回类型被假定为int(不是stdlib.h中为atoll指定的类型),这就是程序意外执行但没有产生错误的原因。 如果你用-Wall 编译你会看到:

警告:函数atoll的隐式声明

当人们使用atof 而不包括stdlib.h 时,这一事实大多会令人震惊,在这种情况下,不会返回预期的double 值。

注意:(作为对问题的 cmets 之一的回答)这就是如果不包含正确的标题,atoll 的结果可能会被截断的原因。

【讨论】:

  • 次要 - 隐式声明在 C89 中很好,而 GCC 默认是这样,所以错误是不合适的。
  • 感谢您的好评!我按照建议使用 -Wall 编译并收到警告。包含正确的库解决了问题。
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2020-12-02
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
相关资源
最近更新 更多