令人不安的C长很长转换字符串(Troubling converting string to long

2019-07-21 16:01发布

我遇到麻烦环礁功能正确设置在C长长值。 这是我的例子:

#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));

这里发生了什么?

Answer 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),使用功能的兼容性,而不必宣布它是第一只产生来自海湾合作委员会的警告,而不是错误(如第一个注释这里所指出的,也隐函数声明被允许在C89,因此产生误差是不恰当的,即另一个原因为何只产生一个警告)。 但这样的函数的返回类型被假定为int (不是在指定类型stdlib.hatoll为例),这就是为什么程序意外执行,但不会产生错误。 如果用编译-Wall ,你会看到:

警告:函数的隐式声明atoll

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

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



文章来源: Troubling converting string to long long in C