PDA

View Full Version : [C] La funzione che non funziona


Berno
20-09-2004, 00:11
Sto scrivendo una funzione che data una stringa in formato csv ne separi i componenti creando un array delle stringhe estratte, sulla carta niente di complicato o almeno speravo :muro:...

La funzione è questa:

char ** divideline (char *line)
{
int i=0,j=0,z=0;
char *string=(char *)calloc(100*sizeof(char));
char **data=(char **)malloc(100*sizeof(char*));
while (1)
{
if ((*(line+i)==0)||(*(line+i)==-1)) break;
else if (*(line+i)!=',')
{
for (j=0;(*(line+i)!=',')&&(*(line+i)!=0);i++,j++)
{
*(string+j)=*(line+i); //1
}
printf("-%s\n",string);
*(data+z)=(char *)calloc(100*sizeof(char)); //2
strcpy(*(data+z),string); //2
z++;
clean(string);
}
else i++;
}
free(string);
}

L'errore sembra essere nella linea commentata con 1 mentre se commento le due righe commentate con 2 tutto funziona correttamente ma ovviamente mi visualizza solo le stringhe senza metterle nell'array...

Zorgolo
20-09-2004, 09:14
char ** divideline (char *line)
{
int i=0,j=0,z=0;
char *string=(char *)calloc(100*sizeof(char));
char **data=(char **)malloc(100*sizeof(char*));
while (1)
{
if ((line[i] == 0) || (line[i] == -1))
break;
else {
if (line[i] != ',') {
for (j=0;(line[i] != ',')&&( line[i] !=0);i++,j++)
{
string[j]=line[i]; //1
}
string[j]=0; //la vogliamo terminiare questa stringa ?:P
printf("-%s\n",string);
data[z]=(char *) calloc(strlen(string)+1); //2
strcpy(data[z],string); //2
z++;
// clean(string);
}
else i++;
}
}
free(string);
}


Non l'ho testata, ma dovrebbe andare :O
Ovviamente se un campo ha lunghezza maggiore a 99 caratteri va
tutto in vacca :D

Berno
20-09-2004, 09:48
Originariamente inviato da Zorgolo
Non l'ho testata, ma dovrebbe andare :O
Ovviamente se un campo ha lunghezza maggiore a 99 caratteri va
tutto in vacca :D
Mi dà lo stesso problema dell'altra, in effetti *(array+i) ed array[i] dovebbero essere equivalenti...
Ovviamente se un campo ha lunghezza maggiore a 99 caratteri va
tutto in vacca :D
Ovviamente, le stringhe che uso per la prova sono lunghe al massimo 85 caratteri :sofico:,,,

Berno
20-09-2004, 09:49
Sorry, doppio post...

Zorgolo
20-09-2004, 12:24
uhm, boh.. questa funziona, comunque avevi fatto un po' di casino con malloc/calloc (non me n'ero accorto lol) e non ritornavi un valore ...


char **divideline (char *line)
{
int i=0,j=0,z=0;
char *string=(char *)malloc(100*sizeof(char));
char **data=(char **)malloc(100*sizeof(char*));

while (1)
{
if ( !line[i] )
break;
else {
if (line[i] == ',')
{
i++;
continue;
}
for (j=0;(line[i] != ',') && ( line[i] ); )
{
string[j++]=line[i++]; //1
}
string[j]=0; //la vogliamo terminiare questa stringa ?:P

printf("-%s\n",string);
data[z]=(char *) malloc(strlen(string)+1); //2
strcpy(data[z],string); //2
z++;
}
}
free(string);
return data;
}

Berno
20-09-2004, 13:30
Originariamente inviato da Zorgolo
uhm, boh.. questa funziona, comunque avevi fatto un po' di casino con malloc/calloc (non me n'ero accorto lol) e non ritornavi un valore ...
Grazie, adesso funziona tutto bene...

Quale valore non ritornavo?