Под «сопоставлением с образцом» я предполагаю, что вы хотите знать, допустима ли такая строка.
#include <stdbool.h>
#include <string.h>
bool is_leap_year(int year)
{
return (year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0); // *)
}
bool in_range(int min, int value, int max)
{
return min <= value && value <= max;
}
bool is_valid_timestamp(char const *datetime)
{
int const days_per_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int y, m, d, h, min, sec;
char seperators[5];
return strlen(datetime) == 19
&& sscanf(datetime, "%d%c%d%c%d%c%d%c%d%c%d", &y, &seperators[0],
&m, &seperators[1], &d, &seperators[2], &h, &seperators[3],
&min, &seperators[4], &sec) == 11
&& in_range(0, y, 9999) && in_range(1, m, 12)
&& in_range(1, d, m == 2 && is_leap_year(y) ? 29 : days_per_month[m - 1])
&& in_range(0, h, 23) && in_range(0, min, 59) && in_range(0, sec, 59)
&& strncmp(seperators, "-- ::", 5) == 0;
}
in_range(0, y, 9999)
... или любой другой год, который вы считаете «действительным».
*) https://stackoverflow.com/a/11595914/3975177