localtime() - ошибка сегментации

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

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";

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

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

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


person Rafael Botas    schedule 21.02.2016    source источник


Ответы (2)


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

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

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


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

person 2501    schedule 21.02.2016
comment
Спасибо за помощь. я проголосую за ваш ответ, когда у меня будет разрешение сделать это. - person Rafael Botas; 21.02.2016

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

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

person Joni    schedule 21.02.2016
comment
Спасибо за помощь. я проголосую за ваш ответ, когда у меня будет разрешение сделать это. - person Rafael Botas; 21.02.2016