Сбой кода по разным причинам.
"2019-10-5"
- это строковый литерал , который strtok(date, "-")
пытается изменить.Это приводит к неопределенному поведению (UB).Конечно, причина ошибки сегментации.
Вместо этого используйте void auxDate(struct tm *t, const char *date)
и анализируйте date
, не пытаясь изменить его.См. strspn()
и strcspn()
.
mktime(&date1)
использует не полностью присвоенный struct tm
.Инициализируйте всех struct tm
членов с struct tm p = { 0 };
.В противном случае неинициализированные члены могут предоставить ошибочные значения для mktime()
.
.tm_mon
- это число месяца с января.Я бы ожидал где-то - 1
.
Поскольку difftime()
возвращает разницу в секундах, а цель - разница в днях.Отсутствует деление на секунды в день.
Есть еще один ключевой случай, требующий решения, который связан с переходом на летнее время и переопределением смещения часового пояса, который сместит разницу во времени примерно на час.
Для обработки код может использовать время в полдень и установить DST на -1
p.tm_hour = 12;
p.tm_isdst = -1;
Затем округлить деление:
days = round(difftime(...)/(24.0*60*60));
Даже это не будетобрабатывать очень редкие случаи, когда часовой пояс Тихоокеанского региона изменил, на какой стороне международной строки даты он находился, что фактически повторило или отменило день.
С хорошей стороны, ваш опубликованный код компилируется.