Я так думаю, neznakomka ожидала приблизительно такой код:
Код:
#define LEN 10 // максимальное число символов в дате
#define CODE0 0 // с датой все в порядке
#define CODE1 1 // слишком много символов в дате
#define CODE2 2 // синтаксическая ошибка в дате
#define CODE3 3 // ошибка в дне
#define CODE4 4 // ошибка в месяце
#define CODE5 5 // ошибка в годе
long test_date(char *s)
{
char temp[LEN + 1], *q, c;
long cnt_point, day, mon, year;
long days[] = {31,0,31,30,31,30,31,31,30,31,30,31};
cnt_point = 0;
for(q = temp; (c = *s) != 0; ++s)
{
switch(c)
{
default:
return(CODE2);
case '\n': case '\t': case ' ':
continue;
case '.':
if(q == temp || q[-1] == '.' || cnt_point == 2)
return(CODE2);
++cnt_point;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
*q++ = c;
}
}
if(cnt_point != 2 || q[-1] == '.')
return(CODE2);
*q = 0;
sscanf(temp, "%d.%d.%d", &day, &mon, &year);
if(year < 1 || year > 9999)
return(CODE5);
if(mon < 1 || mon > 12)
return(CODE4);
// Получить число дней в феврале
days[1] = ((year % 4 == 0 && year % 100 !=0) || year % 400 == 0) ? 29 : 28;
return(day < 1 || day > days[mon - 1] ? CODE3 : CODE0);
}
То есть сначала выполняется ввод без контроля, а потом содержимое
буфера ввода тестируется приведенным выше способом...