Все шаги довольно просты.Но даты всегда сложно, так как есть много правил.Но только пара подает заявку на синтаксический анализ.
Определите структуру для хранения проанализированного значения и анализа входных данных.
[EDIT] Ценность использования структуры в том, что может быть полезно иметь промежуточную функцию, которая будет возвращать этот многоразовый бит двоичных данных.
struct date_s
{
unsigned int day;
unsigned int month;
unsigned int year;
};
// parsing
date_s date = {};
if (strlen(input) != 8 || sscanf(input, "%2u%2u%4u", &date.month, &date.day, &date.year) != 3)
{
// handle error
}
Проверка годадовольно просто, тут нечего делать, если только вы не хотите ограничиться определенным диапазоном.Например, поскольку мы используем григорианский календарь, вы можете ограничиться годами после 1582 года включительно.
Проверка месяца также очень проста, мы проверим это вместе с количеством дней вмесяц, который является самой сложной частью из-за февраля.
unsigned int day_max = 0;
switch (date.month)
{
case 1: case 3: case 5; case 7: case 8: case 10: case 12:
day_max = 31;
break;
case 4: case 6: case 9: case 11:
day_max = 30;
break;
case 2:
if (date.year % 4 != 0)
day_max = 28;
else if (date.year % 100 != 0)
day_max = 29;
else if (date.year % 400 != 0)
day_max = 28;
else
day_max = 29;
break;
// else day_max stays 0, of course
}
if (date.day < 1 || day_max < date.day)
{
// error
}
После того, как все проверки завершены, все, что вам нужно сделать, это напечатать.
В течение месяцев, которые вам понадобятсяопределить таблицу строк для отображения.
const char* MONTH[12] = { "January", /* etc... */ };
Суффикс даты.
const char* SUFFIX[4] = { "st", "nd", "rd", "th" };
Теперь у нас есть все данные, которые нам нужно распечатать, и все в пределах диапазона.
const char* suffix = SUFFIX[std::min(date.day, 4) - 1];
printf("%d%s %s %d", date.day, suffix, MONTH[date.month - 1], date.year);
// or, for US format
printf("%s %d%s, %d", MONTH[date.month - 1], date.day, suffix, date.year);