2016-05-06 3 views
0

У меня проблема с простой функцией (я думаю, из-за неправильного указания указателя). Как функция strptime (функция, которая берет строку и возвращает struct tm со всем набором данных), нет в Windows, я создал функцию strptime, вызвав другие базовые рабочие функции.указатель на struct tm variable, не может вернуть изменения

Вот тестовый код. Внутри функции STRPTIME время хорошо установлено, а затем в основном я теряю информацию.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

void STRPTIME(char *strtm, struct tm *tminfo) 
{ 
    time_t rawtime; 
    int day, month, year; 

    sscanf(strtm, "%d-%d-%d\n", &year, &month, &day); 
    time(&rawtime); 
    tminfo = localtime(&rawtime); 
    tminfo->tm_year = year - 1900; 
    tminfo->tm_mon = month - 1; 
    tminfo->tm_mday = day; 

    mktime(tminfo); 
    printf("date %d-%d-%d\n", tminfo->tm_year, tminfo->tm_mon, tminfo->tm_mday); 
} 

int main() 
{ 
    char stm[11]; 
    struct tm tminfo; 

    strcpy(stm, "2015-12-31"); 
    STRPTIME(stm, &tminfo); 

    printf("tminfo %d-%d-%d\n", tminfo.tm_year, tminfo.tm_mon, tminfo.tm_mday); 

    return(0); 
} 

ответ

0

Проблема заключается в том, что вы перезаписать указатель вашего tminfo аргумента.

tminfo = localtime(&rawtime); 

Аргумент функции как локальная переменная: вы можете перезаписать его. Он живет в стеке. Но ваш абонент не заметит этого изменения.

Вам нужно сделать что-то вроде этого:

// Store the result in a temporary variable. 
struct tm * tmp = localtime(&rawtime); 
if (tmp && tminfo) { 
    // Copy to caller's memory. 
    memcpy(tminfo, tmp, sizeof(*tmp)); 
} 
+0

вы совершенно правы !! Я не думал об этом! 'if' - это проверка, чтобы быть уверенным, что localtime возвращает не' NULL', а вход 'NULL', верно? – Stefano

+0

Кстати, это решение хорошее, чтобы обогнать проблему strptime, или есть что-то более странное и, прежде всего, быстрее? – Stefano

+1

Да, 'if' гарантирует, что и результат' localtime', и аргумент функции не являются 'NULL', так как два аргумента' memcpy' не должны быть 'NULL'. Поскольку ваша версия 'strptime' не имеет аргумента' format', это не совсем эквивалентно. Так ли это «достаточно хорошо», вероятно, зависит от вашего варианта использования. См. Также [этот вопрос] (http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows). – DarkDust