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

ajuda em c

Discussão em 'Programação' iniciada por issues, 15 de Novembro de 2008. (Respostas: 6; Visualizações: 623)

  1. issues

    issues Power Member

    Espero que me consigam ajudar:

    Tenho este programa:
    Código:
    #include <sys/types.h>
      #include <sys/socket.h>
      #include <netinet/in.h>
      #include <arpa/inet.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
     
      int main()
      {
       
        char *users[6]; 
        char *pass[6];   
        char lere[1];
        char ler[1];
        int lertudo,n,i;
        n=0;
        FILE *fp = fopen("./users.dat", "r+");
        
    
        while(!feof(fp)){
            lertudo=fread(ler,sizeof(ler),2,fp);
            users[n]=malloc(strlen(ler) * sizeof(char));
            strcpy(users[n],ler);
             
            
            lertudo=fread(ler,sizeof(ler),1,fp);
            
            lertudo=fread(ler,sizeof(ler),2,fp);
            pass[n]=malloc(strlen(ler) * sizeof(char));
            strcpy(pass[n],ler);
             
            
            lertudo=fread(ler,sizeof(ler),1,fp);
            lertudo=fread(ler,sizeof(ler),1,fp); 
            n=n+1;
        }
        
        for(i=0;i<n;++i){
            printf("%s\n",users[i]);
            printf("%s\n",pass[i]);
        }
    
    o ficheiro users.dat:

    u1,p1;
    u2,p2;
    u3,p3;

    o resultado da execuçao:

    u1
    p10
    u20
    p20
    u30
    p30

    30

    30

    Aqueles zeros nao devia estar nem aqueles dois 30. Alguém pode dar uma ajuda. Por favor.
    Usei compilador gcc e o vi para editar.
     
    Última edição pelo moderador: 17 de Novembro de 2008
  2. IComeFromBehind

    IComeFromBehind Power Member

    O erro deve estar no char ler[1] em conjunção com o strlen e o strcpy, essas funções do c fazem a contagem ou a cópia até encontrarem o caracter de terminação da string.
     
  3. Baderous

    Baderous Banido

    Eu resolvi isso usando umas regex ([^,] e [^;] - a 1ª serve para fazer matching com qualquer caracter desde que não seja uma vírgula e a 2ª o mesmo, mas com ponto e vírgula. Isto obrigou-me a aumentar o tamanho do array da pass para 3, por motivos que não sei explicar porque também não domino regex):
    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void) {
        char *users[3], *pass[3];
        char str[10];
        char leru[2], lerp[3];
        FILE *fp;
        int i=0;
        fp = fopen("cenas.txt","r");
        while (fgets(str,sizeof(str),fp)) {
            sscanf(str,"%[^,],%[^;]",leru,lerp);
            users[i] = (char*)malloc(sizeof(leru));
            strcpy(users[i],leru);
            pass[i] = (char*)malloc(sizeof(lerp));
            strcpy(pass[i],lerp);
            i++;
        }
        for (i=0;i<3;i++)
            printf("%s | %s\n",users[i],pass[i]);
        return 0;
    }
     
  4. issues

    issues Power Member

    Muito Obrigado pela atenção.
     
  5. issues

    issues Power Member

    Tenho isto:
    Código:
    #include <sys/types.h>
      #include <sys/socket.h>
      #include <netinet/in.h>
      #include <arpa/inet.h>
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
     
      int main()
      {
       
        char *users[3], *pass[3];
        char str[10];
        char leru[2], lerp[3], lert[2], lern[2];
        char *num[3];
        char *book[3];
        int  numb[3];
            
        int i=0;
        FILE *fp = fopen("./users.dat", "r+");
        
        while (fgets(str,sizeof(str),fp)) {
            sscanf(str,"%[^,],%[^;]",leru,lerp);
            users[i] = (char*)malloc(sizeof(leru));
            strcpy(users[i],leru);
            pass[i] = (char*)malloc(sizeof(lerp));
            strcpy(pass[i],lerp);
            i++;
        }
        
        FILE *fu = fopen("./titles.dat","r+");
        
        while (fgets(str,sizeof(str),fu)) {
            sscanf(str,"%[^,],%[^;]",lert,lern);
            
            book[i] = (char*)malloc(sizeof(lert)); 
            strcpy(book[i],lert);
            
            num[i] = (char*)malloc(sizeof(lern));
            strcpy(num[i],lern);
    numb[i]=atoi(num[i]);
            i++;
        }
    
        
    
        
        for(i=0;i<3;++i){
            printf("%s\n",book[i]);
            printf("%d\n",numb[i]);
        }
    
    
    }
    
    O ficheiro titles.dat:
    p1,3;
    i1,2;
    m3,4;

    saída:

    (null)
    -1881145344
    Bus error

    Alguém poderia dar-me uma ajuda, por favor.
    Estou a ficar maluco com isto.
     
    Última edição pelo moderador: 17 de Novembro de 2008
  6. Baderous

    Baderous Banido

    Tenta voltar a colocar o valor do i a 0 antes do início do 2º ciclo.
     
  7. issues

    issues Power Member

    Muito obrigado.
     

Partilhar esta Página