在C语言中将字符串转换为长整型存在问题

7
我在使用atoll函数在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));

这里发生了什么?

http://ideone.com/WntSUK 在IDEOne和我的电脑上都尝试过,没有问题?这是全部的代码吗? - Jesus Ramos
对我来说一样。运行良好。 - varnie
3
编译器是哪个?版本是多少?有没有警告(在GCC中使用"-Wall"参数)? - Zeta
5
你漏掉了 #include <stdlib.h>,所以 atoll 的结果可能会被截断。 - Paul R
如果没有原型,C会将返回类型默认为“int”(并发出编译器警告,如果您在Makefile中正确配置了编译源代码语句,那么您应该寻找它),在此系统上,这个值可能比“long long”小(实际上,我几乎可以保证)。 - WhozCraig
显示剩余2条评论
1个回答

12

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

#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程序(pre-C89)兼容,使用一个没有先前声明的函数只会从GCC生成警告而不是错误(正如第一个评论在这里指出的那样,在C89中也允许隐式函数声明,因此生成错误是不合适的,这是为什么只生成警告的另一个原因)。但是,这种函数的返回类型被假定为int(而不是stdlib.h中指定的atoll的类型),这就是为什么程序执行出乎意料但不会生成错误的原因。如果您使用-Wall编译,您将会看到:

Warning: Implicit declaration of function atoll

当人们使用不包含stdlib.hatof时,这个事实通常会使人震惊,这种情况下预期的double值不会返回。

注意:(作为问题评论的答案之一)这就是为什么如果不包括正确的头文件,则atoll的结果可能会被截断的原因。


小细节 - 在C89中,隐式声明是可以的,而GCC默认使用它,因此错误不合适。 - teppic
1
非常感谢您的回复!我按照建议使用了 -Wall 进行编译,得到了警告。包含正确的库解决了问题。 - Justin Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接