Функция c-time возвращает странные значения - PullRequest
0 голосов
/ 02 января 2019

Я работаю с кодом на C, который получает время от сервера, используя следующее:

(Это очень короткая версия, другие разделы и функции кода используют time, ftime ифункции локального времени, чтобы получить время).

struct  tm *stiempo;
long    ltiempo;
FILE * arch2;

int main()
{
  print_error_time();
}


void print_error_time()
{
   time (&ltiempo);
   stiempo = localtime (&ltiempo);
   fprintf (arch2, "%02.2ld/%02.2ld/%02.2ld, \t %02.2ld:%02.2ld:%02.2ld", stiempo->tm_mday, (stiempo->tm_mon + 1), (stiempo->tm_year + 1900), stiempo->tm_hour, stiempo->tm_min, stiempo->tm_sec);
}

Иногда это работает просто отлично, но иногда, когда время печатается в файле, я получаю что-то вроде этого:

   21/08/2018,   15:48:7956003943165722682
   21/08/2018,   15:50:7956003943165722667
   21/08/2018,   15:51:7956003943165722649

Кто-нибудь знает, что может быть причиной такого поведения или что может повлиять на функции времени, которые заставляют их возвращать эти значения?

1 Ответ

0 голосов
/ 02 января 2019

С по местному времени :

Broken-down time is stored in the structure tm which is defined in <time.h> as follows:

struct tm {
    int tm_sec;         /* seconds */
    int tm_min;         /* minutes */
    int tm_hour;        /* hours */
    int tm_mday;        /* day of the month */
    int tm_mon;         /* month */
    int tm_year;        /* year */
    int tm_wday;        /* day of the week */
    int tm_yday;        /* day in the year */
    int tm_isdst;       /* daylight saving time */
};

Все элементы структуры tm имеют тип int, и вы используете для них спецификатор формата %ld в fprintf().Вместо этого следует использовать спецификатор формата %d.

Из стандарта C # 7.21.6.1p9

9 Если спецификация преобразования недопустима, поведение не определено.282) Еслилюбой аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено.

...