Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

strcmp retornando valor errado.

Olá, estrou trabalhando em um algoritmo que simula uma agência de venda de carros, defini uma struct que representa o cadastro de uma pessoa, uma struct para o cadastro de um carro e funções para efetuar esses cadastros. Agora, estou tentando fazer uma função para consultar os carros cadastrados por suas respectivas placas; para comparar as placas dos carros cadastrados com a placa que o usuário fornece estou usando a função strcmp, porém, ela (a função strcmp) me retorna o valor '97', independente de quais sejam as strings usadas em seus parâmetros. Alguém pode me dar uma luz sobre o que deve ser corrigido? Segue o código:

#include <stdio.h>

#include <string.h>

typedef struct data { // struct DATA.

int dia ;
int mes;
int ano;

} Data;

typedef struct pessoa { // struct PESSOA.

char nome[50];
char cpf[15];
Data dtNasc;

} Pessoa;

typedef struct carro { // struct CARRO.

Pessoa dono;
char placa[10];
char modelo[25];
int anoFabricacao;
float preco;

} Carro;

int validarPlaca(char placa[]) {

int I,
    cont = 0;

for(I=0; I<3; I++) { // verifica se os 3 primeiros caracteres são letras.

    if ((placa[I] >= 'A' && placa[I] <= 'Z') || (placa[I] >= 'a' && placa[I] <= 'z')) {

        cont++;
    }
}
if (placa[3] == '-') { // verifica se o quarto caractere da string é um hífen.

    cont++;
}
for(I=4; I<8; I++) { // verifica se os 4 últimos caracteres são números.

    if(placa[I] >= 48 && placa[I] <= 57) {

        cont++;
    }
}
if (cont == 8) { // a variavel "cont", representa o número de caracteres que estão de acordo com uma "placa de carro".

    return 1;

} else {

    return 0;
}

}

Carro cadastrarCarro() {

Carro C;
char DONO[50],
     aux[10];
int VALIDA;

printf("Dono..: ");
fgets(C.dono.nome,50,stdin);
printf("Placa..: ");

do { // verifica se a placa é válida.
    fgets(aux,10,stdin);
    VALIDA = validarPlaca(aux);
} while (VALIDA == 0);

strcpy(C.placa, aux);

printf("Modelo..:");
fgets(C.modelo,25,stdin);

printf("Ano de fabricação..:");
scanf("%d", &C.anoFabricacao);
__fpurge(stdin);

printf("Preço..:");
scanf("%f", &C.preco);
__fpurge(stdin);

return C;

}

void consultarPlaca() {

int valida, I;
char PLACA[10];
Carro C[1000];

printf("Digite a placa que deseja consultar..:");

do { // do - while para verificar se a placa é válida.

    fgets(PLACA, 10, stdin);
    valida = validarPlaca(PLACA);

} while (valida == 0);


for(I=0; I<1000; I++) { // for para verificar a placa de cada carro cadastrado um por um.

    if (strcmp(PLACA, C[I].placa) == 0) { // este é o strcmp que só retorna 97.

        printf("----------\nDONO..: ");
        puts(C[I].dono.nome);

        printf("PLACA..: ");
        puts(C[I].placa);

        printf("MODELO..: ");
        puts(C[I].modelo);

        printf("ANO DE FABRICAÇÃO..: %d\n", C[I].anoFabricacao);
        printf("PREÇO..: %f\n----------\n", C[I].preco);

    }

}

}

int main() { Pessoa vet[10]; Carro carro[10]; char placa[10]; int posAtual = 0, valor, I;

for(I=0; I<3; I++) { // faz o cadastro de 3 carros apenas para fim de testes.

    carro[I] = cadastrarCarro();
}
consultarPlaca();

return 0;

}

2 respostas
solução!

Será que o erro aparece porque você estabeleceu uma comparação entre uma string que não está dentro da estrutura e uma que está dentro de uma estrutura? outra coisa que pode ser que resolva: tente colocar o resultado da comparação entre as duas strings em uma variável e a depender do resultado, se for 0 ou não, ela entra no if ou não. mas deixe o if condicionado ao que ficou armazenado nessa variável e não a comparação direta das duas strings.7 espero ter ajudado. depois me diz se funcionou.

abraço!

Olá! Hoje a tarde consegui resolver o problema, era exatamente isso! Coletei a string "C[I].placa" fora da função e usei ela como parâmetro, depois usei a função para coletar a string "PLACA" e armazenei o retorno da comparação das duas numa outra variável. Muito obrigado pela ajuda!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software