Ir ao conteúdo
  • Cadastre-se

C strcmp não compara corretamente


Pedro VN

Posts recomendados

 .Ola pessoal, estou desenvolvendo alguns programas básicos para aprender a linguagem C, porém estou tendo um problema muito estranho neste programa. Quando eu tento comparar a palavra = LANÇAMENTO, o programa simplesmente não compara, porém quando eu mudo para LANCAMENTO sem o Ç ele funciona normalmente. Primeiro achei que era normal, pois não tinha colocado a biblioteca locale.h, mas depois de ter colocado ainda continua a mesma coisa. Segue o código abaixo: 

 

 

 #include <stdio.h>
 #include <math.h>
 #include <string.h>
 #include <locale.h>

 int main (){

 setlocale(LC_ALL, "Portuguese");

 float desconto, lancamento, preco;
 char fita [50];
 int dia;

 desconto= 0.40;
 lancamento= 0.15;

 printf (" Dia da semana: ");
 scanf  ("%d", &dia);



 printf (" Tipo de fita:  ");
 scanf  ("%s", &fita);



 printf (" Preco da fita: ");
 scanf  ("%f", &preco);

 if (((strcmp (fita, "COMUM")) ==0 || (strcmp (fita, "comum"))==0) && (dia == 2 || dia ==3 || dia == 5)) {

    printf ("teste");

 } else if (((strcmp (fita, "COMUM")) ==0 || (strcmp (fita, "comum"))==0) && (dia == 4 || dia ==6 || dia == 7 || dia == 1)) {

    printf ("teste2");

 } else if (((strcmp (fita, "LANCAMENTO")) ==0 || (strcmp (fita, "lancamento"))==0) && (dia == 2 || dia ==3 || dia == 5)) {

   printf ("teste3");

 } else if (((strcmp (fita, "LANCAMENTO")) ==0 || (strcmp (fita, "lancamento"))==0) && (dia == 4 || dia ==6 || dia == 7 || dia == 1)) {

     printf ("teste4");

 }

 system("pause");
 Return: 0;


 }

 

Bom, desta forma funciona corretamente, agora quando eu coloco pra comparar LANÇAMENTO ou lançamento, aí que da *****. Mal comecei a fazer o programa e já estou preso nesta questão kkk, quem souber responder qual é o problema agradeço desde já. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Pedro VN Testei o seu programa e funcionou (na realidade eu não entendi muito bem o que ele faz)!

 LANCAMENTO.thumb.png.efd5b261d89bf25e28d1c120f44ffe87.png

Uma coisa que eu fiquei curioso. é, qual e o seu compilador (isso não é o editor de códigos) e o sistema operacional?

 

Aqui as modificações que eu fiz no código

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <locale.h>

int main ()
{
  setlocale(LC_ALL, "Portuguese");
  float desconto, lancamento, preco;
  char fita [50];
  int dia;

  desconto= 0.40;
  lancamento= 0.15;

  printf (" Dia da semana: ");
  scanf  ("%d", &dia);

  printf (" Tipo de fita:  ");
  /* scanf  ("%s", &fita);  Isso está errado! */
  scanf  ("%s", fita);

   printf (" Preco da fita: ");
  scanf  ("%f", &preco);

  if (((strcmp (fita, "COMUM")) ==0 || (strcmp (fita, "comum"))==0) && (dia == 2 || dia ==3 || dia == 5)) {

    printf ("teste");

  } 
  else if (((strcmp (fita, "COMUM")) ==0 || (strcmp (fita, "comum"))==0) && (dia == 4 || dia ==6 || dia == 7 || dia == 1)) 
  {
    printf ("teste2");
  } 
  else if (((strcmp (fita, "LANÇAMENTO")) ==0 || (strcmp (fita, "lançamento"))==0) && (dia == 2 || dia ==3 || dia == 5)) 
  {
    printf ("teste3");
  } else if (((strcmp (fita, "LANÇAMENTO")) ==0 || (strcmp (fita, "lançamento"))==0) && (dia == 4 || dia ==6 || dia == 7 || dia == 1)) 
  {
      printf ("teste4");
  }

 return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@KXSY Ola, primeiramente obrigado pelo feedback, talvez seja meu compilador, sou iniciante e o professor da minha faculdade recomendou usar o CodeBlocks, e o sistema que eu uso é o Windows. Sobre o programa é um exercício que comecei a fazer (isso ae é apenas o começo) que tem como objetivo gerenciar uma locadora. Dependendo do tipo de fita (Se for comum ou lançamento)  e o dia da semana( de 1 a 7) o programa irá acrescentar um acréscimo ou um desconto em cima da fita escolhida (ainda não fiz essa parte). Os testes escritos no printf eram só pra testar se as funções if e else estavam retornando corretamente. Agora eu não entendo porque aí no seu funcionou e aqui n kkk. Enfim, vou tentar trocar de IDE pra ver se da certo. Ah e apenas mais uma duvida porque o scanf está errado? Eu sei que ele não é o mais adequado, mas pelo que eu li e me foi falado não tem problema usar pra ler strings em programas simples (pelo menos para iniciantes). Obrigado.

 

Link para o comentário
Compartilhar em outros sites

o problema pode ser esse?-> scanf ("%s", &fita);

Se fita é uma string não deve por o & adiante no scanf, é regra. Lembre... NUNCA PONHA & ADIANTE DE STRINGS OU PONTEIROS

adicionado 1 minuto depois

confesso que n compilei o programa para ver si os if funcionam corretamente mas acredito que funcione bem uma vez arrumado esse problema do &

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá

 

Recomento muito continuar seu programa e seu plano de aprendizado sem ler ou gravar caracteres acentuados. Isso é um inferno e não leva a nada. 

 

Quando por exemplo seu sistema de locadora estiver apto para LOCACAO e DEVOLUCAO de fitas, com todas aquelas muitas funções rodando, você aproveita seus novos conhecimentos em C e volta a esse caso dos caracteres acentuados e implementa a locação e devolução, se é que você me entende ;) 

 

Dependendo de como e onde roda você pode ter esses caracteres ocupando mais posições, com uma letra usando duas posições num texto, as comparações não vão funcionar direito, tipo c é diferente de ç mas faz mesmo diferença?

 

E de todo modo assim que você estiver mais familiarizado com a linguagem e o sistema vai passar a usar a interface gráfica e não essa console chata.

 

Hoje em dia há de fato muito interesse em programas para console mas por razões bem distintas, e não tem a ver com aprendizado, mas sim com o acesso a máquinas remotas que não tem interface gráfica. Mas vou me manter no tópico aqui.

 

Sobre scanf() postei um programa completo aqui e uma discussão sobre isso, e talvez valha pena você pesquisar aqui sobre isso. Eu não me lembro agora do post

 

Em resumo entenda que scanf() é uma rotina ativa: isso quer dizer que ela processa a a entrada --- scan --- tentando satisfazer a máscara de leitura que você usou. Aquilo entre "". E às vezes ela come caracteres, linhas inteiras, parece não retornar e tal. Em muitos casos o problema está no scanf() anterior. Se tentar e não encontrar um post meu com esse programa aqui e tiver interesse escreva de novo e eu procuro em meus arquivos. Não é um erro da rotina: ela foi escrita com um outro propósito e por gente muito muito muito competente.

Link para o comentário
Compartilhar em outros sites

Citação

 

O problema realmente era o "&" do scanf, tirei ele e funcionou normalmente com o Ç. Obrigado a todos, é incrível como um pequeno detalhe muda tudo na programação, eu nunca havia tido este problema antes atribuindo string desta maneira, vou parar com esse hábito.

agora, arfneto disse:

Olá

 

Recomento muito continuar seu programa e seu plano de aprendizado sem ler ou gravar caracteres acentuados. Isso é um inferno e não leva a nada. 

 

Quando por exemplo seu sistema de locadora estiver apto para LOCACAO e DEVOLUCAO de fitas, com todas aquelas muitas funções rodando, você aproveita seus novos conhecimentos em C e volta a esse caso dos caracteres acentuados e implementa a locação e devolução, se é que você me entende ;) 

 

Dependendo de como e onde roda você pode ter esses caracteres ocupando mais posições, com uma letra usando duas posições num texto, as comparações não vão funcionar direito, tipo c é diferente de ç mas faz mesmo diferença?

 

E de todo modo assim que você estiver mais familiarizado com a linguagem e o sistema vai passar a usar a interface gráfica e não essa console chata.

 

Hoje em dia há de fato muito interesse em programas para console mas por razões bem distintas, e não tem a ver com aprendizado, mas sim com o acesso a máquinas remotas que não tem interface gráfica. Mas vou me manter no tópico aqui.

 

Sobre scanf() postei um programa completo aqui e uma discussão sobre isso, e talvez valha pena você pesquisar aqui sobre isso. Eu não me lembro agora do post

 

Em resumo entenda que scanf() é uma rotina ativa: isso quer dizer que ela processa a a entrada --- scan --- tentando satisfazer a máscara de leitura que você usou. Aquilo entre "". E às vezes ela come caracteres, linhas inteiras, parece não retornar e tal. Em muitos casos o problema está no scanf() anterior. Se tentar e não encontrar um post meu com esse programa aqui e tiver interesse escreva de novo e eu procuro em meus arquivos. Não é um erro da rotina: ela foi escrita com um outro propósito e por gente muito muito muito competente.

@arfneto Interessante! Vou procurar dar uma olhada neste post.

Link para o comentário
Compartilhar em outros sites

23 minutos atrás, Pedro VN disse:

O problema realmente era o "&" do scanf, tirei ele e funcionou normalmente com o Ç. Obrigado a todos, é incrível como um pequeno detalhe muda tudo na programação, eu nunca havia tido este problema antes atribuindo string desta maneira, vou parar com esse hábito.

@arfneto Interessante! Vou procurar dar uma olhada neste post.

 

Muito bom que achou o erro

 

Encontrei o link dos posts. Tem dois programas lá, e uma discussão sobre scanf() que pode ser útil. Sugiro tentar rodar os programas em sua máquina e ler a discussão sobre scanf() e os dois  exemplos. O primeiro é sobre os terrminadores e separadores em scanf() e o segundo usa isso em um programa que lê e valida códigos de CPF formatados como 123.456.789-01 e ajuda a lógica por trás de scanf()

 

E

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!