Странное поведение mktime — изменение, если возвращаемое значение присваивается переменной

Я экспериментирую со странным поведением функции mktime(). Когда я присваиваю значение, возвращаемое функцией, значение входного параметра равно одному, а если нет, то значение другое.

Я уже знаю, что mktime() корректирует значения входного параметра struct tm, но происходит другое, давайте посмотрим код с соответствующим выводом:

Первый код

#include <iostream>
#include <time.h>

using namespace std;

int main(int argc, char** argv) {
    struct tm cT;
    strptime("31/07/2014 16:54:00", "%d/%m/%Y%n%T", &cT);
    mktime(&cT);

    cout << "Current Time: "  << cT.tm_mday << "/" << cT.tm_mon + 1 << "/" << cT.tm_year + 1900 << " " << cT.tm_hour << ":" << cT.tm_min << ":" << cT.tm_sec << endl;

}

Вывод:

Текущее время: 31/7/2014 16:54:0

Второй код

#include <iostream>
#include <time.h>

using namespace std;

int main(int argc, char** argv) {
    struct tm cT;
    strptime("31/07/2014 16:54:00", "%d/%m/%Y%n%T", &cT);
    time_t t = mktime(&cT);

    cout << "Current Time: "  << cT.tm_mday << "/" << cT.tm_mon + 1 << "/" << cT.tm_year + 1900 << " " << cT.tm_hour << ":" << cT.tm_min << ":" << cT.tm_sec << endl;

}

Вывод:

Текущее время: 31/7/2014 15:54:0

Любая помощь приветствуется. :)


person Hamlett    schedule 01.08.2014    source источник
comment
time.h устарел. Используйте ctime. Или chrono.   -  person chris    schedule 01.08.2014
comment
@chris, спасибо за информацию!   -  person Hamlett    schedule 01.08.2014


Ответы (1)


Это классический случай, когда забывают инициализировать переменную. В частности, вам необходимо инициализировать переменную cT соответствующими значениями, по крайней мере, для всех полей, которые не будут затронуты strptime (strptime установит только те поля, которые соответствуют дескрипторам полей ввода в строке формата).

Eg. :

struct tm cT = { 0 };
cT.tm_isdst = -1;
strptime("31/07/2014 16:54:00", "%d/%m/%Y%n%T", &cT);
person Sander De Dycker    schedule 01.08.2014
comment
Но он выводит все значения, которые должна заполнять функция strptime(). Так где же неинициализированные данные? Вывод не заботится о tm_isdst. - person Remy Lebeau; 01.08.2014
comment
@RemyLebeau : tm_isdst, который определяет, действует ли летнее время. mktime будет вести себя по-разному в зависимости от значения этого поля. И если он не инициализирован, он может иметь любое значение. - person Sander De Dycker; 01.08.2014
comment
Ничего, теперь я понял. strptime() не заполняет tm_isdst, но mktime() смотрит на него, поэтому его нужно инициализировать вручную. - person Remy Lebeau; 01.08.2014
comment
Здорово! Я просто инициализирую переменную cT = {0}, и после этого все в порядке. Большое спасибо! - person Hamlett; 01.08.2014