代码之家  ›  专栏  ›  技术社区  ›  Aakash Goel

如何使用scanf()将数据读取到时间变量中?

  •  5
  • Aakash Goel  · 技术社区  · 14 年前

    此代码向我发出警告:

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

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

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

    4 回复  |  直到 14 年前
        1
  •  8
  •   Fabian Giesen    14 年前

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

        2
  •  3
  •   Martin v. Löwis    14 年前

    您需要符合系统时间定义的格式。编译时使用

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

    然后

    grep time_t test.i|grep typedef
    

    很可能,这会告诉你时间“long int”,所以你需要用“%ld”扫描它。

        3
  •  2
  •   Frédéric Hamidi    14 年前

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

    现在,如果你是 绝对地 , 积极地 当然可以 time_t 是一个 long long 在您的平台上,如果要避免格式化警告,可以执行以下操作:

    time_t t;
    scanf("%lld", (long long *) &t);
    printf("%lld\n", (long long) t);
    
        4
  •  1
  •   Jonathan Leffler    14 年前

    使用已知大小的整数 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 对于一些时间操作函数,那么您将拥有要使用的正确类型。

    如果您查看的链接URL(的POSIX扩展版本) 扫描因子() 你会发现没有提到 Timet 在那里输入。因此,任何读取的机制 Timet 值与 扫描因子() 必须比直接前进稍微慢一点。同上,任何印刷品 Timet 值也比直接值要小一些。