1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Programar em C - Dúvidas em arrrays e strings

Discussão em 'Programação' iniciada por RDOP, 23 de Junho de 2009. (Respostas: 32; Visualizações: 1325)

  1. RDOP

    RDOP Power Member

    Boas, tenho o seguinte código:
    Código:
    [COLOR=#993333]void[/COLOR] localidade[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR]
    [COLOR=#009900]{[/COLOR]
         [COLOR=#993333]int[/COLOR] i[COLOR=#339933]=[/COLOR][COLOR=#0000DD]0[/COLOR][COLOR=#339933];[/COLOR]
         [COLOR=#993333]int[/COLOR] a[COLOR=#339933]=[/COLOR][COLOR=#0000DD]0[/COLOR][COLOR=#339933];[/COLOR]
         [COLOR=#993333]char[/COLOR] localid[COLOR=#009900][[/COLOR][COLOR=#0000DD]80[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
         [COLOR=#993333]char[/COLOR] localidade[COLOR=#009900][[/COLOR]Y[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
         [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL][COLOR=#009900]([/COLOR][COLOR=#FF0000]"Insira a localidade que pretende procurar:"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
    
         scanf[COLOR=#009900]([/COLOR][COLOR=#FF0000]"%s"[/COLOR][COLOR=#339933],&[/COLOR]localid[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
         
         
         [COLOR=#B1B100]while[/COLOR][COLOR=#009900]([/COLOR]dado[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR].[COLOR=#202020]nome[/COLOR][COLOR=#009900][[/COLOR][COLOR=#0000DD]0[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933]!=[/COLOR][COLOR=#FF0000]'[COLOR=#006699][B]\0[/B][/COLOR]'[/COLOR][COLOR=#009900])[/COLOR]
         [COLOR=#009900]{[/COLOR]
                 [COLOR=#B1B100]if[/COLOR][COLOR=#009900]([/COLOR]strcmp [COLOR=#009900]([/COLOR]dado[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR].[COLOR=#202020]localidade[/COLOR][COLOR=#339933],[/COLOR]localid[COLOR=#009900])[/COLOR] [COLOR=#339933]==[/COLOR] [COLOR=#0000DD]0[/COLOR][COLOR=#009900])[/COLOR]
          [COLOR=#009900]{[/COLOR]
                      [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL] [COLOR=#009900]([/COLOR][COLOR=#FF0000]"Nome:%s"[/COLOR][COLOR=#339933],[/COLOR]dado[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR].[COLOR=#202020]nome[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                      [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL] [COLOR=#009900]([/COLOR][COLOR=#FF0000]"Idade:%i[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#339933],[/COLOR]dado[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR].[COLOR=#202020]idade[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                      [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL] [COLOR=#009900]([/COLOR][COLOR=#FF0000]"Localidade:%s"[/COLOR][COLOR=#339933],[/COLOR]dado[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR].[COLOR=#202020]localidade[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                      [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL] [COLOR=#009900]([/COLOR][COLOR=#FF0000]"Altura:%d[COLOR=#000099][B]\n[/B][/COLOR][COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#339933],[/COLOR]dado[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR].[COLOR=#202020]altura[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                                            
              a[COLOR=#339933]++;[/COLOR]
              i[COLOR=#339933]++;[/COLOR]
          [COLOR=#009900]}[/COLOR]
         i[COLOR=#339933]++;[/COLOR]
         [COLOR=#009900]}[/COLOR]
         [URL="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"][COLOR=#000066]printf[/COLOR][/URL][COLOR=#009900]([/COLOR][COLOR=#FF0000]"Existem %d registos para esta Localidade[COLOR=#000099][B]\n[/B][/COLOR]"[/COLOR][COLOR=#339933],[/COLOR] a[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]



    O compilador não dá qualquer erro mas quando faço a pesquisa o programa nunca encontra nenhuma Localidade.

    Cumprimentos
     
  2. xetiro

    xetiro Power Member

    Não tem a ver com o problema, mas no scanf não precisas de ter &localid, basta teres scanf("%s", localid);

    Não estou a ver bem como estás a funcionar com a estrutuda dos dados (dado[]), mas parto do principio que ela já exista com os nomes das localidades préviamente colocados, right? A função não deveria receber um ponteiro para o primeiro elemento da estrutura do dados?
     
    Última edição: 23 de Junho de 2009
  3. conversoid

    conversoid Power Member

    O scanf para mim parece-me bem, no entanto já tentaste imprimir o conteúdo do dado.localidade e localid para ver se ambos estão a imprimir alguma coisa?
     
  4. RDOP

    RDOP Power Member

    Boas conversoid, exprimentei imprimir o conteúdo e aparece correctamente.
    A minha estrutura de dados:
    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #define Z 5000
    #define X 150
    #define Y 150
    
    struct dados{
           char nome[X];
           int idade;
           int altura;
           char localidade[Y];
    };
    struct dados dado[Z];
    
    Quando corro o programa e pesquiso por localidade, ele nunca encontra uma correspondência, não entendo porque, o código parece me estar correcto.

    Cumprimentos
     
    Última edição: 23 de Junho de 2009
  5. xetiro

    xetiro Power Member

    Sabes usar o GDB? Era pores um break no ciclo e experimentares fazer algumas impressões dos conteudos dos elementos da estutura para veres pq é que ele não está a encontrar.

    PS: O scanf está bem, mas é escusado utilzar o & e o indice. Quando se trata de strings, basta utilizar o nome da variável, pq a própria variável contém o endereço da posição zero.
     
    Última edição: 23 de Junho de 2009
  6. RDOP

    RDOP Power Member

    Boas xetiro, eu uso o Dev C++, já coloquei break no ciclo mas não me parece haver nada de mal. Ele apenas nunca encontra a igualdade aqui:

    if(strcmp (dado[i].localidade,localid) == 0)
     
  7. xetiro

    xetiro Power Member

    Não tenho a certeza, mas para usares o strcmp, que é uma função sobre strings, não tens que fazer o #include <string.h> ?

    Já agora, não tem a ver com o problema mas, o i++ dentro do if esta a mais. Já o estás a fazer dentro do ciclo depois do if. Assim como está, se por acaso o programa executar o que está dentro do if, vai saltar um elemento da estrutura, pq incrementa dentro do if e logo a seguir ao if. No printf da idade tb tens um %i em vez de um %d.
     
  8. RDOP

    RDOP Power Member

    Tens razão xetiro eu já tinha corrigido o i++; meti um else{} assim já não salta 1 elemento.
    Acabei de colocar o #include <string.h> mas continua tudo na mesma
     
  9. xetiro

    xetiro Power Member

    Estás com espaço entre o strcmp e o primeiro parentisis? Pelo menos é o que tens ali em cima. Deves ter tudo junto, mas não sei se isso tem influência, até pq deveria dar um erro.

    Tens ali a estrutura definida, mas onde e como é que estás a criar os elementos? E como os estás a preencher?
     
  10. RDOP

    RDOP Power Member

    Sim tinha um espaço já esta corrigido, mas nada alterou.
    Eu obtenho os elementos de um ficheiro assim:

    Código:
    void carregar_dados()
    {
         
         int i=0;
         char c;
         FILE *dados;
         dados = fopen("dados.txt","r");
         while(!feof(dados))
         {
             fgets(dado[i].nome,X,dados);
             fscanf(dados," %d", &dado[i].idade);
             fscanf(dados,"%c",&c);
             fgets(dado[i].localidade,Y,dados);
             fscanf(dados," %d", &dado[i].altura);
             fscanf(dados,"%c",&c);
             i++;
         }
                
    }
    
     
  11. ski3

    ski3 Power Member

    Experimenta usar o gets em vez do scanf que tas a usar para ler a localidade a pesquisar.
     
  12. RDOP

    RDOP Power Member

    Boas ski3, já retirei o scanf e meti o gets, mas agora ele nem me pede nada passa logo todo o código.
     
  13. ski3

    ski3 Power Member

    Faz antes do gets fflush(stdin), faz rebuild all no dev caso o problema continue coloca um break point e faz debug.
    Ou entao mete um printf da localidade depois de leres para ver se o conteudo da mesma está correcto.

    EDIT: nao metas indice no gets nem o &
     
    Última edição: 23 de Junho de 2009
  14. RDOP

    RDOP Power Member

    Obrigado ski3, eu ntroduzi o fflush(stdin) e ele já faz o get e meti printf para ver se estava correcto o conteúdo está tudo bem. Mas ele continua a não encontrar a igualdade aqui
    Código:
     if(strcmp(dado[i].localidade,localid) == 0)
    
     
  15. ski3

    ski3 Power Member

    Atenção que o C é case sensitive.
    Experimenta inserir na localidade e na localid a mesma coisa tudo em minusculas por exemplo
    Se não der mete um breakpoint nesse if e ve qual é o valor dos 2 campos.
     
  16. RDOP

    RDOP Power Member

    Pois eu sei que o C é case sensitive.
    Ski3 o valor dos 2 campos no if é:

    dado.localidade="Almada\n","\0"
    localid="Almada\0\0jP_v\020\0\0\0àp\"......................
     
  17. ski3

    ski3 Power Member

    Experimenta mudar o tamanho do campo localidade para 80
    Nao metes-te & nem indice no localid quando fazes o gets pois nao?
     
  18. RDOP

    RDOP Power Member

    Fiz o que disseste Ski3 tenho isto assim:

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> 
    #define Z 5000
    #define X 150
    #define Y 80
    
    struct dados{
           char nome[X];
           int idade;
           int altura;
           char localidade[Y];
    };
    struct dados dado[Z];
    
    

    E tenho:
    gets(localid);
     
  19. ski3

    ski3 Power Member

    E continua a nao dar?
    Experimenda fazer o fflush que te disse a pouco antes de leres a localid.
    Nao tou a ver nenhum motivo para isso nao dar...ele ta a por lixo no localid depois de ler para la preenche o resto com lixo...devia por logo um /0 depois de ler o localid..
     
  20. RDOP

    RDOP Power Member

    Eu já tinha colocado o fflush, mostro-te aqui o código:

    Código:
    void localidade()
    {
         int i=0;
         int a=0;
         char localid[80];
         char localidade[Y];
         printf("Insira a localidade que pretende procurar:");
         
         fflush(stdin);
         gets(localid);
       
        
         printf("%s\n",localid);
         
         while(dado[i].nome[0]!='\0')
         {
         printf("%s",dado[i].localidade);
        
                 if(strcmp(dado[i].localidade,localid) == 0)
          {
                      printf ("Nome:%s",dado[i].nome);
                      printf ("Idade:%d\n",dado[i].idade);
                      printf ("Localidade:%s",dado[i].localidade);
                      printf ("Altura:%d\n\n",dado[i].altura);
                                            
              a++;
              i++;
          }
          else
          {
         i++;
         }
         }
         printf("Existem %d registos para esta Localidade\n", a);
    }
    
     

Partilhar esta Página