Darlam Alves , no while the values are not lost , no , and what happens in that your code is that you put special characters between the type specifiers in the scanf , and this causes errors in reading , so the function returns random values , and it would also be better to use string’s for reading , so if characters other than digits are typed there will be no loss of control of the program , and if you need to use integer values, then convert the string’s "array" to int with the function atoi , and your code with some modifications could be like this :
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char s_dia[10];
char s_mes[10];
char s_ano[10];
int dia;
int mes;
int ano;
}data;
int formatoData ( int , int , int );
int verificarFormatoData ( data* , char* , char* , char* );
int main()
{
data inserir;
inserir.dia = 11;
printf("Informe o dia o mes e o ano\n");
scanf ("%s%s%s", inserir.s_dia , inserir.s_mes , /// nao pode colocar caracteres
inserir.s_ano); /// estranhos no scanf , nao !
verificarFormatoData (&inserir, inserir.s_dia, inserir.s_mes, inserir.s_ano );
printf("\n\tDatas Corretas ! >>> "); /// Quando retorna é porque estao certas
printf("%d / %d / %d",inserir.dia,inserir.mes,inserir.ano);
printf("\n\n\n");
return 0;
}
int verificarFormatoData ( data* inserir , char diA[10], char meS[10], char anO[10] )
{
int dia = atoi(diA); /// se houver carac q nao seja digitos
int mes = atoi(meS); /// atoi retorna zero para a variaveL
int ano = atoi(anO); /// converter array "string" para inteiro
while ( formatoData ( dia , mes , ano ) == 0 ) /// se zero entao tem erros
{ /// escrever o resultaDo para saber como estah
printf("\n\t== valores ReceBides ==\n\
\r\tDia -> %d \n\
\r\tMes -> %d \n\
\r\tAno -> %d\n",
dia, mes, ano); /// apenas uma chamada a printf
/// fica mais rapido a execucao
printf ("A data inserida eh invalida .\n\
\rpor favor digite uma data existente -: ");
scanf ("%s%s%s", diA , meS , anO ); /// caract estranhos no scanf
/// causam falhas inesperadas
dia = atoi(diA); /// se houver carac q nao seja digitos
mes = atoi(meS); /// atoi retorna zero para a variaveL
ano = atoi(anO); /// converte string em int
}
inserir->dia = dia; /// essa setinha serve parac acessar campos de struct
inserir->mes = mes; /// coloco três barras pois uso o codeblocks e a cor
inserir->ano = ano; /// nos comentarios ficam mais visiveis assim
/// essa linha de baixo nao é necessaria , pois ela é uma repeticao
/// de inserir->dia = dia;
(*inserir).dia = dia; /// usando um cast também daria certo
/// aqui só para referencia
/// return inserir; /// se quiser pode deletar essa linha aqui de cima
return 0; /// se Quiser pode retornar esse vetor de struct "inserir"
} /// mas nao faria difereça pois essa struct é variáveL Global
int formatoData ( int dia, int mes, int ano )
{
int tem_erro = 0;
if ( dia < 1 || dia > 31 )
{
printf ("\nERRO:Informe um dia válido\n\n");
tem_erro++;
}
if ( mes < 1 || mes > 12 )
{
printf ("\nERRO:Informe um mes valido\n\n");
tem_erro++;
}
if ( ano < 2010 )
{
printf ("\nERRO:Informe um ano acima de 2010\n\n");
tem_erro++;
}
if( tem_erro )return 0;
return 1;
}
If you’ve ever created one
struct
for the date, why not use it directly instead of spending day, month and year separately? I don’t understand exactly what you want to do, but finally, a suggestion: https://ideone.com/xJB7ew– hkotsubo