Jump to content
zezima

comparar strings

Recommended Posts

zezima

tenho um erro quando executo o meu codigo,creio que o erro se encontra nesta função,esta e utilizada para comparar duas strings e enquanto nao forem iguais, vou incrementando uma variavel,quando as strings forem iguais devolvo a variavel que estive a incrementar.

O erro e que quando chamo esta funcao,ela nao devolve o que eu esperava.

int procura_linha (char pais[])

{

    int c;
    for(c=0;c<DIM;c++)
    {
    if (strcmp(informacao[c].nome_pais, pais) == 0)


return c;    

    }

return 0;
}

Share this post


Link to post
Share on other sites
bubulindo

Importas-te de incluir, sei lá... mais código, as strings que usaste para experimentar a função...

Com o que está aí não dá para chegar longe.

Depois reparei numa coisa, o array de estruturas informacao é uma variável global?

Não seria melhor tirares isto de dentro da função, ou criares uma função que recebesse informacao e a linha que pretendes encontrar nela?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
pmg

Atenção às maiusculas e minusculas

strcmp("Ola", "ola") != 0

Em POSIX, mas não no Standard de C, tens a função strcasecmp() que nao diferencia maiusculas de minusculas.

Atenção a espaço em branco extra

strcmp("pt", "pt ") != 0

strcmp("pt", "pt\n") != 0

Atenção que a função strcmp aceita "strings", isto é, ponteiros para arrays de caracters que contem um '\0'.

char not_a_string[3] = "OLA";

Não passes "strings não terminadas" para a strcmp().


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
zezima

o codigo e o seguinte

struct informacao_pais {

   char nome_pais[PAIS];

   float divida,pib;

}informacao[DIM];
int procura_linha (char pais[])

{

    int c;
    strcpy(informacao[0].nome_pais,pais);	

    for(c=0;c<DIM;c++)
    {
    if (strcmp(informacao[c].nome_pais,pais) == 0)


return c;    

    }

return 0;
}

Share this post


Link to post
Share on other sites
pmg

Para que é que estás a copiar o país para o primeiro elemento do array informacao

...

e logo a seguir a comparar esses dois valores?

    strcpy(informacao[0].nome_pais,pais);	

    for(c=0;c<DIM;c++)
    {
    if (strcmp(informacao[c].nome_pais,pais) == 0)

Em principio iria *SEMPRE* comparar igual.

Como dizes que não compara igual, só me resta concluir uma de três coisas:

1. O código que aqui puseste não é o código que compilaste

2. Estás a despoletar Comportamento indefenido algures no teu código

3. O teu compilador / biblioteca não é standard


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
bubulindo

Incrível...

Repara no que eu disse:

Importas-te de incluir, sei lá... mais código, as strings que usaste para experimentar a função...

...

Depois reparei numa coisa, o array de estruturas informacao é uma variável global?

Ou seja, eu já sabia que tinhas um array de estruturas. Logo colocares aqui um array com a definição da estrutura não me diz nada de novo.

No entanto, se colocasses mais código em vez da definição da estrutura, como a função main() ou a função de onde chamas esta, poderias já ter o problema resolvido.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
zezima

peço desculpa, o codigo  e este :

int procura_linha (char pais[])
{
    int i;
    for (i=0; i<DIM; i++)
    {
        if (strcmp(informacao[i].nome_pais, pais) == 0)
        {
            return i;
        }
    }
    return 0;
}

void incrementa_divida (float matriz[DIM][DIM], int s)
{
    int u, n=0, i;
    while (n<s)
    {
        i = procura_linha(defaul[n].nome_pais3);
        for (u=0; u<DIM ; u++)
        if (matriz [i][i]== 0)
            {
                if (matriz[i][u]!= 0)
                    {
                        informacao[u].divida = informacao[u].divida + matriz[i][u];
                        matriz[i][i]=1;
                    }
            }
        n++;
    }
}

o procura_linha deve devolver-me o inteiro que corresponde a posicao do pais na estrutura, so que nao sei porque apesar de as strings que recebo serem strings do tipo "ALE" ou "POR" (strings de 3 caracteres) em maiusculas, o procura linha nao me esta a devolver o valor certo.

ps: aquela strcpy(informacao[0].nome_pais,pais); foi algo que usei para testar o valor que a funcao devolvia, o codigo acima e o codigo normal.

Share this post


Link to post
Share on other sites
pmg

0 é um valor perfeitamente natural para procura_linha devolver. Quer dizer que o pais pedido é o primeiro do array. -- e também quer dizer que não foi achado.

Estes duas interpretações do valor 0 são incompativeis!

Sugiro que retornes -1 quando não encontrares o pais.

int procura_linha(const char *pais) {
    /* ... o que já tens ... */
    return -1;
}

Em C, os arrays começam no índice 0.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
falk0n

Para além do que  o pmg indicou correctamente acerca do valor retornado 0 ser dúbio, podes tentar utilizador um debbuger (gdb por exemplo) ou então colocares um printf em cada passo do ciclo para verificar o que possa conter cada posição do array informacao.

A função printf não é optima para efectuar debug de código, mas se não souberes manipular um debbuger poderá ser um mecanismo para tentar compreender o que se passa no teu programa.

Boas programações

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.