Перевод строки в дату - 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;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы со временем и строками.
  2. Объявление константы MAX_LEN, которая определяет максимальную длину строки.
  3. Определение функции parse_date, которая принимает на вход строку и возвращает время в формате time_t.
  4. Внутри функции parse_date объявление переменных year, mon, day для хранения чисел, извлеченных из строки.
  5. Использование функции sscanf для извлечения трех чисел из строки. Если числа успешно извлечены, функция возвращает 3.
  6. Создание структуры tm time и обнуление ее полей.
  7. Проверка корректности введенных чисел: месяц должен быть от 0 до 11, день - от 1 до 31, год - от 1900.
  8. Если числа корректны, присваиваем соответствующие значения полям структуры tm time.
  9. Возвращаем значение функции mktime, применяя к созданной структуре tm time.
  10. В функции main считываем строку с помощью fgets.
  11. Вызываем функцию parse_date, передавая ей введенную строку.
  12. Если функция parse_date вернула значение больше или равное нулю, выводим сообщение It's date.
  13. Если функция parse_date вернула значение меньше нуля, выводим сообщение It's not date.
  14. Завершение функции main.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы