#include <stdio.h>
#include <time.h>

time_t testDatum(const char*d)
{
	struct tm t={0};
	unsigned a,b,c;
	int n;
	if( 3!=sscanf(d,"%u.%u.%4u%n",&a,&b,&c,&n) || d[n]) return -1;
	t.tm_year = c-1900;
	t.tm_mon = b-1;
	t.tm_mday = a;
	return mktime(&t)!=(time_t)-1?t.tm_year==c-1900&&t.tm_mon==b-1&&t.tm_mday==a?mktime(&t):-1:-1;
}

int main(void) {
	time_t t;
	puts((t=testDatum("1.1.1970"))==(time_t)-1?"?":ctime(&t));
	puts((t=testDatum("29.2.2016"))==(time_t)-1?"?":ctime(&t));
	puts((t=testDatum("29.2.2015"))==(time_t)-1?"?":ctime(&t));
	puts((t=testDatum("1.1.1970abc"))==(time_t)-1?"?":ctime(&t));
	puts((t=testDatum("1.1.197"))==(time_t)-1?"?":ctime(&t));
	puts((t=testDatum("31.4.1970"))==(time_t)-1?"?":ctime(&t));
	puts((t=testDatum("31.5.1970"))==(time_t)-1?"?":ctime(&t));
	return 0;
}
