fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct {
  5. int dia;
  6. int mes;
  7. int ano;
  8. } Data;
  9.  
  10. int dataValida(Data *data) {
  11. int dia = data->dia;
  12. int mes = data->mes;
  13. int ano = data->ano;
  14.  
  15. if (mes < 1 || mes > 12) {
  16. printf ("\nERRO: Informe um mes valido\n\n");
  17. return 0;
  18. }
  19. if (ano < 2010) {
  20. printf ("\nERRO: Informe um ano acima de 2010\n\n");
  21. return 0;
  22. }
  23. int diasNoMes;
  24. switch(mes) {
  25. case 4:
  26. case 6:
  27. case 9:
  28. case 11:
  29. diasNoMes = 30;
  30. break;
  31. case 2:
  32. // se ano é bissexto, fevereiro tem 29 dias, senão tem 28
  33. diasNoMes = (ano % 4) == 0 && ((ano % 100) != 0 || (ano % 400) == 0) ? 29 : 28;
  34. break;
  35. default:
  36. diasNoMes = 31;
  37. }
  38. if (dia < 1 || dia > diasNoMes) {
  39. printf ("\nERRO: Informe um dia válido\n\n");
  40. return 0;
  41. }
  42.  
  43. return 1;
  44. }
  45.  
  46.  
  47. int main() {
  48. Data *data = malloc(sizeof * data);
  49. printf("Informe o dia, mês e ano (formato dd/mm/aaaa): ");
  50. if (scanf("%d/%d/%d", &data->dia, &data->mes, &data->ano) == 3) {
  51. if (dataValida(data)) {
  52. printf("Data digitada: %02d/%02d/%04d\n", data->dia, data->mes, data->ano);
  53. // continua usando a data aqui da forma que quiser
  54. } else printf("data inválida\n");
  55. } else { // não leu 3 números
  56. printf("data inválida\n");
  57. // limpar o buffer, pois scanf não remove os caracteres do buffer em caso de erro
  58. // isso pode ser necessário caso você precise ler mais dados depois
  59. // ver mais em https://pt.stackoverflow.com/q/42981/112052 e https://pt.stackoverflow.com/q/111697/112052
  60. int c;
  61. while ((c = getchar()) != '\n' && c != EOF);
  62. }
  63. return 0;
  64. }
  65.  
Success #stdin #stdout 0s 5572KB
stdin
1/2/2021
stdout
Informe o dia, mês e ano (formato dd/mm/aaaa): Data digitada: 01/02/2021