ajuda em c

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:
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.
 
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;
}
 
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:
Back
Topo