#include <stdio.h>
#include <stdlib.h>
typedef struct {
int dia;
int mes;
int ano;
} Data;
int dataValida(Data *data) {
int dia = data->dia;
int mes = data->mes;
int ano = data->ano;
if (mes < 1 || mes > 12) {
printf ("\nERRO: Informe um mes valido\n\n"); return 0;
}
if (ano < 2010) {
printf ("\nERRO: Informe um ano acima de 2010\n\n"); return 0;
}
int diasNoMes;
switch(mes) {
case 4:
case 6:
case 9:
case 11:
diasNoMes = 30;
break;
case 2:
// se ano é bissexto, fevereiro tem 29 dias, senão tem 28
diasNoMes = (ano % 4) == 0 && ((ano % 100) != 0 || (ano % 400) == 0) ? 29 : 28;
break;
default:
diasNoMes = 31;
}
if (dia < 1 || dia > diasNoMes) {
printf ("\nERRO: Informe um dia válido\n\n"); return 0;
}
return 1;
}
int main() {
Data
*data
= malloc(sizeof * data
); printf("Informe o dia, mês e ano (formato dd/mm/aaaa): "); if (scanf("%d/%d/%d", &data
->dia
, &data
->mes
, &data
->ano
) == 3) { if (dataValida(data)) {
printf("Data digitada: %02d/%02d/%04d\n", data
->dia
, data
->mes
, data
->ano
); // continua usando a data aqui da forma que quiser
} else printf("data inválida\n"); } else { // não leu 3 números
// limpar o buffer, pois scanf não remove os caracteres do buffer em caso de erro
// isso pode ser necessário caso você precise ler mais dados depois
// ver mais em https://pt.stackoverflow.com/q/42981/112052 e https://pt.stackoverflow.com/q/111697/112052
int c;
while ((c
= getchar()) != '\n' && c
!= EOF
); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCAgZGlhOwogICAgaW50ICBtZXM7CiAgICBpbnQgIGFubzsKfSBEYXRhOwoKaW50IGRhdGFWYWxpZGEoRGF0YSAqZGF0YSkgewogICAgaW50IGRpYSA9IGRhdGEtPmRpYTsKICAgIGludCBtZXMgPSBkYXRhLT5tZXM7CiAgICBpbnQgYW5vID0gZGF0YS0+YW5vOwoKICAgIGlmIChtZXMgPCAxIHx8IG1lcyA+IDEyKSB7CiAgICAgICAgcHJpbnRmICgiXG5FUlJPOiBJbmZvcm1lIHVtIG1lcyB2YWxpZG9cblxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoYW5vIDwgMjAxMCkgewogICAgICAgIHByaW50ZiAoIlxuRVJSTzogSW5mb3JtZSB1bSBhbm8gYWNpbWEgZGUgMjAxMFxuXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGludCBkaWFzTm9NZXM7CiAgICBzd2l0Y2gobWVzKSB7CiAgICBjYXNlIDQ6CiAgICBjYXNlIDY6CiAgICBjYXNlIDk6CiAgICBjYXNlIDExOgogICAgICAgIGRpYXNOb01lcyA9IDMwOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICAgIC8vIHNlIGFubyDDqSBiaXNzZXh0bywgZmV2ZXJlaXJvIHRlbSAyOSBkaWFzLCBzZW7Do28gdGVtIDI4CiAgICAgICAgZGlhc05vTWVzID0gKGFubyAlIDQpID09IDAgJiYgKChhbm8gJSAxMDApICE9IDAgfHwgKGFubyAlIDQwMCkgPT0gMCkgPyAyOSA6IDI4OwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBkaWFzTm9NZXMgPSAzMTsKICAgIH0KICAgIGlmIChkaWEgPCAxIHx8IGRpYSA+IGRpYXNOb01lcykgewogICAgICAgIHByaW50ZiAoIlxuRVJSTzogSW5mb3JtZSB1bSBkaWEgdsOhbGlkb1xuXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKCmludCBtYWluKCkgewogICAgRGF0YSAqZGF0YSA9IG1hbGxvYyhzaXplb2YgKiBkYXRhKTsKICAgIHByaW50ZigiSW5mb3JtZSBvIGRpYSwgbcOqcyBlIGFubyAoZm9ybWF0byBkZC9tbS9hYWFhKTogIik7CiAgICBpZiAoc2NhbmYoIiVkLyVkLyVkIiwgJmRhdGEtPmRpYSwgJmRhdGEtPm1lcywgJmRhdGEtPmFubykgPT0gMykgewogICAgICAgIGlmIChkYXRhVmFsaWRhKGRhdGEpKSB7CiAgICAgICAgICAgIHByaW50ZigiRGF0YSBkaWdpdGFkYTogJTAyZC8lMDJkLyUwNGRcbiIsIGRhdGEtPmRpYSwgZGF0YS0+bWVzLCBkYXRhLT5hbm8pOwogICAgICAgICAgICAvLyBjb250aW51YSB1c2FuZG8gYSBkYXRhIGFxdWkgZGEgZm9ybWEgcXVlIHF1aXNlcgogICAgICAgIH0gZWxzZSBwcmludGYoImRhdGEgaW52w6FsaWRhXG4iKTsKICAgIH0gZWxzZSB7IC8vIG7Do28gbGV1IDMgbsO6bWVyb3MKICAgICAgICBwcmludGYoImRhdGEgaW52w6FsaWRhXG4iKTsKICAgICAgICAvLyBsaW1wYXIgbyBidWZmZXIsIHBvaXMgc2NhbmYgbsOjbyByZW1vdmUgb3MgY2FyYWN0ZXJlcyBkbyBidWZmZXIgZW0gY2FzbyBkZSBlcnJvCiAgICAgICAgLy8gaXNzbyBwb2RlIHNlciBuZWNlc3PDoXJpbyBjYXNvIHZvY8OqIHByZWNpc2UgbGVyIG1haXMgZGFkb3MgZGVwb2lzCiAgICAgICAgLy8gdmVyIG1haXMgZW0gaHR0cHM6Ly9wdC5zdGFja292ZXJmbG93LmNvbS9xLzQyOTgxLzExMjA1MiBlIGh0dHBzOi8vcHQuc3RhY2tvdmVyZmxvdy5jb20vcS8xMTE2OTcvMTEyMDUyCiAgICAgICAgaW50IGM7CiAgICAgICAgd2hpbGUgKChjID0gZ2V0Y2hhcigpKSAhPSAnXG4nICYmIGMgIT0gRU9GKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==