Ir para conteúdo
Fórum Script Brasil
  • 0

Comparação De Strings


Guest Luckxander

Pergunta

Guest Luckxander

Estou tentando comparar duas strings mas no final só registra como print=1; e informa que a placa não foi encontrada.

Alguém sabe me dizer o que tem de errado nesse bloco lógico ?

(usei as bibliotecas stdio,stdlib,iostream,conio e string.h)

comparador=1;

cout<<"\nSAIDA DE VEICULO";

cout<<"\nInforme a placa(xxx-yyyy): ";

gets(novaplaca); //obtem a placa para verificaçao

for(i=0; i<contador; i++){

comparador=strcmpi(novaplaca,p->placa); //compara as strings, se iguais retorna(0)

if(comparador==0){

print=0;//registra que encontrou a placa

break; //interrompe a busca

}

else{

print=1; //registra que não achou a placa

}

p++; //incrementa o ponteiro dentro do for

}

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0
Guest Luckxander

Abaixo vai o código completo, é só copiar e colar que tá rodando certinho, o único problema é que não está achando a placa do carro para fazer retirada do estacionamento.

#include <iostream.h>

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <time.h>

//estrutura para cadastrar o carro

struct dados{

double hora,hora2,minuto,minuto2;

char placa[8];

char data[10];

double valorfracao;

};

void main(){

int nvagas,contador,opcao;

char novaplaca[8];

int i,print,msg,comparador;

double tempo1,tempo2,tempototal,valor;

dados *p; //declara o ponteiro da estrutura dados

p=(dados*)malloc(sizeof(dados));//aloca dinamicamente memoria para o ponteiro

cout<<"ESTACIONAMENTO UNATEC";

//relogio para simples ilustraçao - biblioteca time.h

time_t timer;//define a estrutura de conversao de tempo

struct tm *tblock; //declara a estrutura

timer = time(NULL); //obtem a hora do sistema

tblock = localtime(&timer);//converte a hora em estrutura (tblock)

cout<<"\n"<<asctime(tblock); //exibe a hora

cout<<"\nInforme a quantidade de vagas disponiveis: ";

cin>>nvagas;

cout<<"\nInforme o preço da fraçao: ";

cin>>p->valorfracao;

contador=0; //inicializa as vagas ocupadas

msg=0; //aciona o while

while (msg==0){ //inicia o loop de exibiçao

cout<<"\n\nVagas disponiveis: "<<nvagas; //exibe o numero de vagas disponiveis

cout<<"\nVagas ocupadas: "<<contador; //exibe o numero de vagas ocupadas

cout<<"\n\nInforme a opcao\n"; //exibe o menu

cout<<"0-Fechar \n"; //opçao do menu

cout<<"1-Entrada de veiculos \n"; //opçao do menu

cout<<"2-Saida de veiculos \n"; //opçao do menu

cin>>opcao; //registra a opçao escolhida

switch(opcao){ //cria o menu

case 0 : {cout<<"\nPrograma encerrado"; //case 0 - processa a primeira opçao do menu

msg=1; //sai do loop while

free(p); //libera a memoria alocada

break;} //encerra a instruçao

case 1 : { if (nvagas == 0){ //case 1 - processa a segunda opçao do menu

clrscr();

cout<<"\nESTACIONAMENTO LOTADO";

break; //encerra a instruçao

}

else{

clrscr();

cout<<"\nENTRADA DE VEICULO";

cout<<"\nInforme a placa(xxx-yyyy): ";

gets(p->placa);

cout<<"\nInforme a Data(xx/xx/xxxx): ";

gets(p->data);

cout<<"\nInforme a Hora(00 a 24): ";

cin>>p->hora;

cout<<"\nInforme os Minutos(00 a 59): ";

cin>>p->minuto;

nvagas=nvagas-1; //atualiza a quantidade de vagas disponiveis

contador=contador+1; //atualiza a quantidade de vagas ocupadas

clrscr();

cout<<"\nVEICULO CADASTRADO"; break; //exibe a mensagem e encerra a instruçao

}

}

case 2 : { if(contador==0){ //case 2 - processa a terceira opçao do menu

clrscr();

cout<<"\nESTACIONAMENTO VAZIO"; break; //exibe a mensagem e encerra a instruçao

}

else{

clrscr();

comparador=1;

cout<<"\nSAIDA DE VEICULO";

cout<<"\nInforme a placa(xxx-yyyy): ";

gets(novaplaca); //obtem a placa para verificaçao

for(i=0; i<contador; i++){

comparador=strcmpi(novaplaca,p->placa); //compara as strings, se iguais retorna(0)

if(comparador==0){

print=0;//registra que encontrou a placa

break; //interrompe a busca

}

else{

print=1; //registra que não achou a placa

}

p++; //incrementa o ponteiro dentro do for

}

if(print==1){

for(i=0; i<contador; i++){

p--; //volta as posiçoes do ponteiro para o inicio

}

cout<<"\nVEICULO não ENCONTRADO"; break;

}

if(print==0){

cout<<"\nInforme a hora(00 a 24): ";

cin>>p->hora2; //recebe a hora de saida

cout<<"\nInforme os minutos(00 a 59): ";

cin>>p->minuto2; //recebe os minutos de saida

clrscr();

cout<<"\nSAIDA DE VEICULO";

cout<<"\nPlaca: "<<p->placa;

cout<<"\nHora de entrada: "<<p->hora<<":"<<p->minuto;

cout<<"\nHora de saida: "<<p->hora2<<":"<<p->minuto2;

tempo1=((p->hora2*60)-(p->hora*60)); //convertendo hora em minutos

tempo2=((p->minuto2)-(p->minuto));

tempototal=tempo1+tempo2; //calcula o tempo total em minutos

cout<<"\nTempo de parmanencia: "<<tempototal<<" minutos";

valor=((tempototal/15)*p->valorfracao); //calcula o preço total

cout<<"\nPreço da fraçao: "<<p->valorfracao;

cout<<"\nTotal a pagar: "<<valor;

nvagas=nvagas+1; //atualiza a quantidade de vagas disponiveis

contador=contador-1; //atualiza a quantidade de vagas ocupadas

}

}

break;} //encerra a instruçao

}

}

getch(); //obtem comandos de exibiçao de tela

}

Link para o comentário
Compartilhar em outros sites

  • 0

Tenta simplesmente comparar as duas strings sem o laço for:

comparador=strcmpi(novaplaca,p->placa); //compara as strings, se iguais retorna(0)

if(comparador==0)

print=0;//registra que encontrou a placa

else

print=1; //registra que não achou a placa

Link para o comentário
Compartilhar em outros sites

  • 0

Uma vez tive que fazer um programa semelhante, veja o código que usei para fazer uma busca:

pesquisar()
    {
    NOME dados[10];
    char nome[100];
    int i;
    clrscr();
    if (cont==1)  // a primeira vez, então não tem registros gravados
        {
        cout<<"Nenhum registro gravado!!!\a";
        cont=0;
        getch();
        return(0);
        }
    cout<<"Informe o nome da pessoa a ser consultado: ";
    gets(nome);
    for(i=0;i<10;i++)
        if (strcmp(nome,dados[i].nome)==0)   //Você tem que digitar o nome EXATAMENTE igual
            {
            cout<<"Nome: "<<dados[i].nome<<"\n";
            cout<<"Endereço: "<<dados[i].end<<"\n";
            cout<<"Telefone: "<<dados[i].tel;
            getch();
            break;
            }
        if(strcmp(nome,dados[i].nome)!=0)   //Se o nome NÃO foi digitado EXTAMENTE igual
            {
            cout<<"NOME INVALIDO!!!\a";
            getch();
            }
    return(0);
    }

Veja se te ajuda e tenta adptar no seu código.

Link para o comentário
Compartilhar em outros sites

  • 0

ontem eu testei rapidamente seu código,

não deu pra ver tudo, mas da um print nas duas variáveis que voce precisa comparar antes de usar o comando strcmp, voce vai ver que mesmo digitando a mesma placa elas não serão iguais

.
.
.
cout<<"\nInforme a placa(xxx-yyyy): ";
gets(novaplaca); //obtem a placa para verificaçao

printf("digitou: %s          armazenado: %s\n",novaplaca, p->placa);

for(i=0; i<contador; i++){
comparador=strcmpi(novaplaca,p->placa); //compara as strings, se iguais retorna(0)
.
.
.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Luckxander

descobri um detalhe:

se eu digitar a placa sem hífem e espaço ela funciona.

Ou seja, ao invés de xxx-yyyy eu digito xxxyyyy.

Será porque o hífem não é reconhecido como string ?

Link para o comentário
Compartilhar em outros sites

  • 0

descobri um detalhe:

se eu digitar a placa sem hífem e espaço ela funciona.

Ou seja, ao invés de xxx-yyyy eu digito xxxyyyy.

Será porque o hífem não é reconhecido como string ?

o hífen é um caracter,

veja só uma coisa na declaracão de sua estrutura char placa[8];

contando com o hifen voce tem 8 caracteres, mas voce se esquece que uma string é finalizada com '\0', então precisa de mais um na declaracão.

outra coisa é a funcao gets, ela não é recomendada já que não checa estouro de buffer, voce pode usar a funcão fgets para substitui-la.

;)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...