Как прочитать данные в переменную time_t, используя scanf ()? - PullRequest
5 голосов
/ 13 ноября 2010

Этот код выдает мне предупреждения:

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

8 голосов
/ 13 ноября 2010

Точный тип time_t зависит от вашей платформы и ОС.Это все еще довольно часто 32 бит (или int или long), а не 64, и некоторые даже используют плавающие числа.Правильнее всего будет прочитать целое число известного размера (int или long long), а затем присвоить значение time_t в качестве второго шага.

3 голосов
/ 13 ноября 2010

Вам нужен формат, соответствующий определению time_t вашей системы. Компилировать с

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

тогда

grep time_t test.i|grep typedef

Скорее всего, это скажет вам, что time_t это "long int", поэтому вам нужно отсканировать его с "% ld".

2 голосов
/ 13 ноября 2010

Во-первых, ваш компилятор прав: ничто не гарантирует, что time_t на самом деле является 64-битным целым числом со знаком.Это может быть 32-разрядное целое число или даже значение с плавающей точкой, в зависимости от платформы.

Теперь, если вы абсолютно , положительно уверены, чтоtime_t - это long long на вашей платформе, и вы хотите избежать предупреждений о форматировании, вы можете сделать:

time_t t;
scanf("%lld", (long long *) &t);
printf("%lld\n", (long long) t);
1 голос
/ 13 ноября 2010

Используйте известный размер целого числа с 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) scanf(), вы увидите, что там нет упоминания типа time_t. Таким образом, любой механизм для чтения значений time_t с помощью scanf() должен быть несколько меньше, чем прямой. То же самое, что печатает time_t значений, также несколько меньше, чем прямое.

...