How to write a function that returns appropriate values of a date (day, month and year) so that these are assigned to struct-type variables?

Asked

Viewed 44 times

0

I wanted to develop a function responsible for analyzing the format of the date inserted, however the appropriate values would have to be returned to another function responsible for registering other elements. This is the moment when I call in duty cadastro the function of verificarFormatoData.

printf ("Informe o dia o mes e o ano\n");
scanf ("%d/%d/%d", &inserir.dia, &inserir.mes, &inserir.ano);
verificarFormatoData (inserir.dia, inserir.mes, inserir.ano)

The correct values of verificarFormatoData should be equated with inserir.dia; inserir.mes; inserir.ano. Below is the form in which it was written.

int verificarFormatoData (int dia, int mes, int ano){
    while (formatoData(dia, mes, ano)==0){
        printf ("A data inserida e invalida, por favor digite uma data existente"); 
        scanf ("%d/%d/%d", &dia, &mes, &ano);
    }
    return 0; 
}

When you finish while the values will be zero, so I won’t be able to recover them to use them in the register function to be written in a file. Follows below the function formatoData that generates the loop in verificarFormatoData

int formatoData (int dia, int mes, int ano){
    if (dia<0 || dia>31){
        printf ("\nERRO:Informe um dia válido\n\n");
        return 0;
    }
    if (mes<=0 || 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;
    }
    return 1;
}
  • 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

1 answer

0


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;
}
  • Of course it can have "special" characters in the scanf, can have any character - provided, of course, the user type correctly, so it is important to check the return of it: https://ideone.com/L0ZCBD

Browser other questions tagged

You are not signed in. Login or sign up in order to post.