2016-12-05 7 views
2

Непонятное поведение функции strptime():Почему функция c-функции strptime меняет структуру?

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

double getPeriod(char * dateStart, char * dateStop) { 
    struct tm tmStart, tmStop; 
    time_t timeStampStart, timeStampStop; 

    strptime(dateStart, "%Y-%m-%d %H:%M:%S", &tmStart); 
    strptime(dateStop, "%Y-%m-%d %H:%M:%S", &tmStop); 

    timeStampStart = mktime(&tmStart); 
    timeStampStop = mktime(&tmStop); 

    printf("%d\t%d\n", tmStart.tm_hour, tmStop.tm_hour); 
} 

int main() 
{ 
    getPeriod("2016-12-05 18:14:35", "2016-12-05 18:18:34"); 
    return 0; 
} 

Выход:

17 18 

Почему это происходит?

компилятор GCC (GCC) 6.2.1 ОС Linux

+1

Вам необходимо инициализировать член 'tm_isdst'' timeStampStart' и 'timeStampStop' до -1. – user4815162342

+0

[Кажется, нужно работать на GCC и Clang здесь] (http://coliru.stacked-crooked.com/a/6b54f234cc33eb6c) – AndyG

+0

@ user4815162342: О, человек, что летнее время всегда есть такая боль! И я думаю, что вы предназначались для 'tmStart' и' tmStop' – AndyG

ответ

1

tmStart и tmStop не инициализированы, поэтому некоторые поля будут инициализированы при передаче mktime. Таким образом, поведение технически не определено.

На странице strptime людей (обратите внимание на первые два предложения):

В принципе, эта функция не инициализирует тм, но только сохраняет указанные значения. Это означает, что перед вызовом необходимо инициализировать tm. Информация немного отличается между различными системами UNIX. Реализация glibc не касается тех полей, которые явно не указаны, за исключением того, что она перекомпонует поле tm_wday и tm_yday, если изменились какие-либо элементы года, месяца или дня.

+0

Спасибо очень! – Sergey

 Смежные вопросы

  • Нет связанных вопросов^_^