2016-02-21 5 views
0

У меня есть этот код, который возвращает недельный день с даты типа «29-02-2016», но иногда это дает мне ошибку сегментации в локальном времени (& t).localtime() - ошибка сегментации

int obterDiaSemana(char *str) { 
struct tm tm2; 
if(strptime(str, "%d-%m-%Y", &tm2) != NULL) { 
    time_t t = mktime(&tm2); 
    return localtime(&t)->tm_wday; //Sunday=0, Monday=1, etc. 
} 
return -1; 
} 

функция получает:

char userDate[10]="29-02-2016"; 

Я искал решение, но не могу решить эту проблему.

Заранее спасибо.

Если вам нужна дополнительная информация, просто дайте мне знать.

ответ

2

Вы не инициализируете struct tm tm2. Когда он передается strptime только члены, указанные в строке формата "%d-%m-%Y" устанавливается со значениями, другие остаются неизменными, в этом случае UNINITIALIZED, поэтому их значения являются неопределенными.

Передача частично инициализированной структуры tm2 в mktime() приведет к неопределенному поведению.

Вам нужно будет инициализировать структуру с некоторыми значениями, предпочтительно с нулями.


И массив userDate слишком мал, чтобы содержать "29-02-2016".

+0

Спасибо за помощь. плохо проголосовать за свой ответ, когда у меня есть разрешение на это. –

1

Две проблемы в этом коде: вы не инициализируете tm2, поэтому он может содержать любые значения. Если mktime не нравится его параметр, он вернется (time_t) -1. Вызов localtime((time_t)-1) кажется врезаться с Segfault.

Вы должны инициализировать tm2 и проверить, возвращается ли localtime -1.

+0

Спасибо за помощь. плохо проголосовать за свой ответ, когда у меня есть разрешение на это. –