如何使用scanf()将数据读入time_t变量?

时间:2010-11-13 07:35:18

标签: c gcc compiler-warnings

这段代码给了我警告:

$ cat test.c
#include<stdio.h>
#include<time.h>

int main() {

    time_t t;
    scanf("%lld", &t);
    printf("%lld\n", t);
    return 0;
}
$ gcc test.c -o test
test.c: In function ‘main’:
test.c:7: warning: format ‘%lld’ expects type ‘long long int *’, but argument 2 has type ‘time_t *’
test.c:8: warning: format ‘%lld’ expects type ‘long long int’, but argument 2 has type ‘time_t’
$ 

除警告外,代码按预期工作。

我怎么办才能在编译时得不到警告(请不要编译编译器技巧)?

4 个答案:

答案 0 :(得分:8)

time_t的确切类型取决于您的平台和操作系统。它仍然经常是32位(intlong),而不是64,有些甚至使用浮点数。正确的做法是读入已知大小的整数(intlong long),然后将值分配给time_t作为第二步。

答案 1 :(得分:3)

您需要的格式与系统的time_t定义相匹配。用

编译
gcc test.c -o test --save-temps

然后

grep time_t test.i|grep typedef

最有可能的是,这会告诉你time_t是“long int”,所以你需要用“%ld”扫描它。

答案 2 :(得分:2)

首先,您的编译器是正确的:没有任何保证time_t实际上是64位有符号整数。它可以是32位整数甚至是浮点值,具体取决于平台。

现在,如果您绝对肯定确保time_t是您平台上的long long,并且您希望避免格式化警告,你可以这样做:

time_t t;
scanf("%lld", (long long *) &t);
printf("%lld\n", (long long) t);

答案 3 :(得分:1)

使用scanf()的已知大小的整数,然后将结果转换为time_t

#include <stdio.h>
#include <time.h>

int main()
{
    long long llv;
    time_t t;
    scanf("%lld", &llv);
    t = llv;
    printf("%lld\n", (long long)t);
    return 0;
}

在这个例子中,它似乎并没有给你带来太大的影响,但如果你想将变量t传递给某些时间操作函数,那么你就可以使用正确的类型了。

如果您查看({1}}的(POSIX扩展版本)的链接网址,您会发现那里没有提及scanf()类型。因此,使用time_t读取time_t值的任何机制都必须比直接更少。同上,任何打印scanf()值的内容也都比直接前提更差。