Перевод строки в дату - C (СИ)
Формулировка задачи:
Господа, собственно проблема.
Дано задание - при вводе строки типа YYYY-MM-DD программа должна определить является ли данная строка представлением даты или нет.(Извините за мой русский, просто перевожу задание из иностранного учебника).
Дан пример работы программы:
2000-15-20 is not a date.
Fri 2015-11-06 is a date.
Собственно, в учебнике дана подсказка в виде используйте функцию mktime(), но разобраться я с ней не смог.
Помогите пожалуйста разобраться.
Решение задачи: «Перевод строки в дату»
textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
const int MAX_LEN = 100;
time_t parse_date(char *str)
{
int year, mon, day;
if (sscanf(str, "%d-%d-%d", &year, &mon, &day) == 3) //Если sscanf найдет нормальную дату, то вернет количество считанных полей
{
struct tm time;
memset(&time, 0, sizeof(time)); // Обнуляем структуру
if (mon < 0 || mon > 11 || day < 1 || day > 31 || year < 1900)
return -1;
time.tm_mon = mon - 1;
time.tm_mday = day;
time.tm_year = year - 1900;
time.tm_isdst = -1;
return mktime(&time);
}
return -1;
}
int main(void)
{
char s[MAX_LEN];
fgets(s, MAX_LEN, stdin);
time_t time = parse_date(s);
if (time >= 0) printf("It's date\n");
else printf("It's not date\n");
return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы со временем и строками.
- Объявление константы MAX_LEN, которая определяет максимальную длину строки.
- Определение функции parse_date, которая принимает на вход строку и возвращает время в формате time_t.
- Внутри функции parse_date объявление переменных year, mon, day для хранения чисел, извлеченных из строки.
- Использование функции sscanf для извлечения трех чисел из строки. Если числа успешно извлечены, функция возвращает 3.
- Создание структуры tm time и обнуление ее полей.
- Проверка корректности введенных чисел: месяц должен быть от 0 до 11, день - от 1 до 31, год - от 1900.
- Если числа корректны, присваиваем соответствующие значения полям структуры tm time.
- Возвращаем значение функции mktime, применяя к созданной структуре tm time.
- В функции main считываем строку с помощью fgets.
- Вызываем функцию parse_date, передавая ей введенную строку.
- Если функция parse_date вернула значение больше или равное нулю, выводим сообщение
It's date. - Если функция parse_date вернула значение меньше нуля, выводим сообщение
It's not date. - Завершение функции main.