【问题标题】:How to read data into a time_t variable using scanf()?如何使用 scanf() 将数据读入 time_t 变量?
【发布时间】:2010-11-13 07:35:17
【问题描述】:

这段代码给了我警告:

$ 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’
$ 

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

我应该怎么做才能在编译时不收到警告(请不要使用编译器杂注技巧)?

【问题讨论】:

  • 我会坚持使用 printf() 来查看 sizeof(time_t) 是什么,然后进行转换。通常 uint32_t 对我有用。

标签: c gcc compiler-warnings


【解决方案1】:

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

【讨论】:

  • 为了安全起见,我会使用尽可能大的尺寸。而strtoull 将是比scanf 更好的选择。
  • @R..: strtoll() 因为time_t 通常已签名。
  • +1。实际上,POSIX 允许 time_t 是整数或实数浮点类型。
  • 确实如此。 strtold 可能是最好的选择。
【解决方案2】:

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

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

然后

grep time_t test.i|grep typedef

这很可能会告诉您 time_t 是“long int”,因此您需要使用“%ld”对其进行扫描。

【讨论】:

  • 如果你在不同的架构上得到不同的答案,你可以ifdef你的代码使其对他们“可移植”
【解决方案3】:

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

现在,如果您绝对,肯定确定time_t 在您的平台上是long long,并且您想避免格式警告,您可以做到:

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

【讨论】:

    【解决方案4】:

    对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 传递给一些时间操纵函数,那么你将有正确的类型可以使用。

    如果您查看scanf()(的POSIX 扩展版本)的链接URL,您会发现那里没有提到time_t 类型。因此,使用scanf() 读取time_t 值的任何机制都必须稍微简单一些。同上,任何打印 time_t 值的东西也不是直截了当的。

    【讨论】:

      猜你喜欢
      • 2013-12-23
      • 2023-03-04
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 2011-07-09
      • 2015-01-19
      相关资源
      最近更新 更多