Autor Tópico: strcmp devolve valor errado  (Lida 4328 vezes)

Offline marciovos

  • Usuário Ubuntu
  • *
  • Mensagens: 13
    • Ver perfil
strcmp devolve valor errado
« Online: 26 de MAR?O de 2010, 15:23 »
galera to com um tremendo problema,
estou usando linguagem C para fazer um shell
mas a minha duvida mesmo é simples(eu acho)

estou usando o comando strcmp para comparar strings certo?
tipo
strcmp (ope,"limpa"))

sei que se as strings  forem iguais ele devolve 0,
mas ele nao esta voltando 0 de forma alguma
volta 1 e -1 e ainda por cima se eu digitar "caixa" ele volta 1 se eu digitar "limpa" ele também volta 1

codigo a serguir

Código: [Selecionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10

int main()
{
char ope[MAX];
int exit=1;
do
{

fgets(ope,MAX,stdin);
printf("strcmp(ope,limpa)=%d\n",strcmp (ope,"limpa"));
printf("strcmp(ope,'sair')=%d\n",strcmp (ope,"sair"));

}while(exit!=0);
}

resultado execuçao

limpa
strcmp(ope,limpa)=1
strcmp(ope,'sair')=-1
caixa
strcmp(ope,limpa)=1
strcmp(ope,'sair')=-1


intaum nao sei oq eh
acho que pode ser o compilador mas nao tenho certeza
Márcio Vinícius O. Sena - Goiânia/GO - Ubuntu 9.10 & W7- HP Pavilion dv4. 4gb. ATI 256mb. 300gb.

Offline jeflui

  • Usuário Ubuntu
  • *
  • Mensagens: 745
    • Ver perfil
Re: strcmp devolve valor errado
« Resposta #1 Online: 26 de MAR?O de 2010, 15:56 »
Código: [Selecionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10

int main()
{
        char ope[MAX];
        int exit=1;
        do
        {
                scanf("%s", &ope);
                printf("strcmp(ope,limpa)=%d\n",strcmp (ope,"limpa"));
                printf("strcmp(ope,'sair')=%d\n",strcmp (ope,"sair"));

        }while(exit!=0);
}
« Última modificação: 26 de MAR?O de 2010, 15:58 por jeflui »

Offline marciovos

  • Usuário Ubuntu
  • *
  • Mensagens: 13
    • Ver perfil
Re: strcmp devolve valor errado
« Resposta #2 Online: 28 de MAR?O de 2010, 22:36 »
mano sei que o scanf tambem tem essa função de ler
mas ele nao trata tantos erros
como esse sistema meu precisa
mesmoa assim agradeço.


Galera descobrir que
ao ler com fgets ele insere do "vetor" o que eu escrevi + /0, diante disso
deveria trocar esse /0 por algum caracter
para quando comparar como  strcmp
ai vai dar certo
alguem poderia ajudar
Márcio Vinícius O. Sena - Goiânia/GO - Ubuntu 9.10 & W7- HP Pavilion dv4. 4gb. ATI 256mb. 300gb.

Offline jeflui

  • Usuário Ubuntu
  • *
  • Mensagens: 745
    • Ver perfil
Re: strcmp devolve valor errado
« Resposta #3 Online: 29 de MAR?O de 2010, 09:15 »
Depois do seu fgets, de um simples printf na variável vai perceber que ela não está recebendo o que foi digitado. Por isso não está funcionando o strcmp.

Offline HelderC

  • Usuário Ubuntu
  • *
  • Mensagens: 227
  • helderc at IRC.Freenode
    • Ver perfil
    • HelderC
Re: strcmp devolve valor errado
« Resposta #4 Online: 02 de Abril de 2010, 19:34 »
cara, faz o seguinte:

Código: [Selecionar]
...
qualquerVariavel = strcmp (ope,"limpa");

printf("strcmp(ope,limpa)=%d\n",qualquerVariavel);
...

Entendeu? Utiliza o strcmp para jogar o valor de retorno numa variavel e depois usa essa variavel no printf.
Já tive um problema assim, mas no meu caso, eu havia colocado o strcmp em um if... if (strcmp(...))...

flw.

Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: strcmp devolve valor errado
« Resposta #5 Online: 20 de Abril de 2010, 15:38 »
mano sei que o scanf tambem tem essa função de ler
mas ele nao trata tantos erros
como esse sistema meu precisa
mesmoa assim agradeço.


Galera descobrir que
ao ler com fgets ele insere do "vetor" o que eu escrevi + /0, diante disso
deveria trocar esse /0 por algum caracter
para quando comparar como  strcmp
ai vai dar certo
alguem poderia ajudar

Leia sobre o comportamento de fgets:

fgets()
       reads in at most one less than size characters from stream  and
       stores  them  into  the buffer pointed to by s.  Reading stops after an
       EOF or a newline.  If a newline is read, it is stored into the  buffer
.
       A '\0' is stored after the last character in the buffer


Ou seja, o \r que você digita ao final da string (em stdin) é colocado na string em "opt". Note que se você imprimir um strlen(ope) obterá 6 para a string "limpa", digitada...

Assim, "limpa\r" é sempre maior que "limpa".