Перевод строки в дату - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д