Why does the function leValidaText return trash?

Asked

Viewed 71 times

0

I’m trying to validate the license plate of the car, but I’m not getting it. I tried to use the scanf instead of fgets and nothing. I have no idea what might be causing the problem.

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#include <ctype.h>



/* 
Lucas Correia Barros
Síntese
Objetivo: Cadastrar carros de um colecionador
Entrada: Placa do carro e valor de aquisição
Saída: Carro cadastrado (C), listagem(L) dos carros cadastrados ate o momento, que contenham na placa as tres primeiras
letras da placa especificada, e encerramento(E), mensagem caso seja tentado o cadastramento de carros acima do máximo
permitido (Cadastro cheio)
 */

#define MAX_CARROS 200
#define MAX_PLACA 7
#define MIN_PLACA 7
#define MAX_VALOR 999999

//Le e valida opcao
char opcaoDesejada();
//Le e valida placa
void leValidaTexto(int valorMin, int valorMax, char texto[]);
int verificaPlaca(char placa[]);
char validaPlacaRepetido(int contadorCarros,char placas[][MAX_PLACA],char placa[]);


int main(){

    char opcao, placas[MAX_CARROS][MAX_PLACA]={0}, placa[MAX_PLACA]={0};
    float valor_aquisicao[MAX_CARROS];
    int contadorCarros=0, placaFlag=0, repetido=0;




    do{
        opcao = opcaoDesejada();
        system("cls");
        switch(opcao){
            case 'c':
                if(contadorCarros > MAX_CARROS){
                    printf("CADASTRO CHEIO!");
                }
                else
                    {
                        printf("Veiculo n%c %d\n", 167, contadorCarros+1);


                        leValidaTexto(MIN_PLACA, MAX_PLACA, placa);
                        printf("%s", leValidaTexto);
                        placaFlag = verificaPlaca(placa);


                        do{

                        repetido=validaPlacaRepetido(contadorCarros,placas,placa);

                        if((repetido)== 1 || (placaFlag==0)){
                            printf(" Placa ja existe \n");

                        }else{
                            strcpy(placas[contadorCarros],placa);
                        }

                        }while((repetido)== 1 || (placaFlag==0));

                        contadorCarros++;
                    }
        }


    }while(opcao != 'e');

    return 0;   
}

char opcaoDesejada(){

        char opcao;

        do{
            printf("\nCADASTRO DE AUTOMOVEIS\n\n");
            printf("C - CADASTRE UM CARRO\n");
            printf("L - LISTE OS CARROS CADASTRADOS\n");
            printf("E- ENCERRE O PROGRAMA\n");
            scanf(" %c", &opcao);
            opcao = tolower(opcao);
            if(opcao != 'c' && opcao != 'l' && opcao != 'e'){
                printf("\nOpcao desejada invalida. Tente novamente: ");
                }
        }while(opcao != 'c' && opcao != 'l' && opcao != 'e');

        return opcao;
    }

void leValidaTexto(int valorMin, int valorMax, char texto[]){

    do{
        printf("Digite a placa do veiculo:");
        fflush(stdin);
        fgets(texto, valorMax+1, stdin);

        if(texto[strlen(texto)-1] == '\n'){
            texto[strlen(texto)-1] = '\0';
        }

        if(strlen(texto)<valorMin || strlen(texto)<valorMax){
            printf("Placa invalida");
        }
    }while(strlen(texto)<valorMin || strlen(texto)<valorMax);
}

int verificaPlaca(char placa[]){

    int cont,flag=1;

    for(cont=0;cont<7;cont++){

      if(cont<3){
        if(!isalpha(placa[cont])){
            flag=0;
            break;

        }
    }else
        if(!isdigit(placa[cont])){
        flag=0;
        break;      
        }

    }
    return flag;
}

char validaPlacaRepetido(int contadorCarros,char placas[][MAX_PLACA],char placa[]){
    int repetido=0,cont;

    for(cont=0;cont<=contadorCarros;cont++){
        if(stricmp(placas[cont],placa)==0){
            repetido = 1;
            return repetido;

        }
    }
    return repetido;
}   

1 answer

0


Your code seems to be still in development and I believe you’re still learning, otherwise you could be using something as elaborate as structs, then I believe you have some limitations to do this exercise.

Considering that, I’ll answer your question directly:

leValidaTexto(MIN_PLACA, MAX_PLACA, placa);
printf("%s", leValidaTexto);

You’re trying to print the function leValidaText as if it were a string, and it does not return anything, it is not being called in the printf. However, you send the string plaque for the function and it is there that the board is stored, you right in the next row to this printf realize this because it uses the variable plaque, that is, where the string that the user types has been saved correctly:

placaFlag = verificaPlaca(placa);

So, instead of trying to print the function as if it were a string, print the variable plaque:

leValidaTexto(MIN_PLACA, MAX_PLACA, placa);
printf("%s", placa);

Browser other questions tagged

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