PDA

View Full Version : [C] array di stringhe senza ripetizioni


ghiltanas
22-01-2014, 18:20
Sto andando in crisi su una minchiata:

"Scrivere un programma che legga da tastiera una stringa P, un intero N e una sequenza S di N stringhe. Il programma deve stampare in ordine lessicografi co tutte le stringhe distinte in S che hanno P come suffisso"
L'input e formattato nel seguente modo: la prima riga contiene la stringa
P mentre la seconda riga contiene l'intero N. Seguono N righe contenenti
una stringa ciascuna.
L'output a video deve contenere solo e soltanto le stringhe distinte che
soddisfano la condizione sopra ordinate lessicogra camente e stampate una
per riga
L'output a video deve contenere solo e soltanto le stringhe distinte che
soddisfano la condizione sopra ordinate lessicogra camente e stampate una
per riga
"

http://pastebin.com/uE9UnPam questo è il mio codice (a forza di modificarlo spero di non averci scritto boiate)
gcc -o non mi da errori, ho però errore di segmentazione.(potrei usare valgrind, ma se mi spiegaste dove sbaglio e perchè forse la prox volta evieterei di commettere errori simili)

lorenzo001
22-01-2014, 19:52
Qui


b=(char**)malloc(occ*sizeof(char*));
for(i=0;i<occ;i++)
strcpy(b[i],a[i]);


utilizzi la strcpy con puntatori a stringhe non allocate (le b[i])

bancodeipugni
22-01-2014, 19:58
ho guardato il codice ma...

allochi 101 caratteri di char per ogni ciclata e poi gli scrivi sopra
ma non fai prima a mettere una stringa di 101 char cosi' il vettore preallocato è sempre quello dato che ne conosci già la dimensione, fissa ?

a ogni ciclata finisto di usare temp, dovresti fare free(temp);

cosi' stai creando dei leaks

ghiltanas
22-01-2014, 20:18
Qui


b=(char**)malloc(occ*sizeof(char*));
for(i=0;i<occ;i++)
strcpy(b[i],a[i]);


utilizzi la strcpy con puntatori a stringhe non allocate (le b[i])

intanto correggo quest'oscenità...il compilatore quando vede ste cose dovrebbe essere autorizzato a insultarmi

ghiltanas
22-01-2014, 20:26
ho guardato il codice ma...

allochi 101 caratteri di char per ogni ciclata e poi gli scrivi sopra
ma non fai prima a mettere una stringa di 101 char cosi' il vettore preallocato è sempre quello dato che ne conosci già la dimensione, fissa ?

a ogni ciclata finisto di usare temp, dovresti fare free(temp);

cosi' stai creando dei leaks

temp dici che posso pure toglierlo in questo caso?

l'ho utilizzato perchè ho fatto qualche esercizio, tipo questo http://pastebin.com/qD30eLm2 e il temp interno mi aveva fatto comodo :fagiano:

lorenzo001
22-01-2014, 20:39
Anche in questo esercizio vedo un sacco di malloc ma niente free ...

Se non c'è lo stesso numero di malloc e di free, allora hai un memory leak

ghiltanas
22-01-2014, 20:47
Hai ragionissima, ma detto sinceramente al momento le Free le ignoro, al momento nel senso al mio livello, xké non pesano... Ovviamente a meno che non mi diano esplicitamente errore...vedo di aggiungerle cmq ;-)

ghiltanas
22-01-2014, 20:57
FUNZIONA! :D

grazie mille a entrambi ;) , devo sciogliere un pò di dubbi su come vengono trattate le stringhe, in particolare come gestisce i puntatori e la memoria, e sul cast della compare

bancodeipugni
22-01-2014, 21:09
secondo me potresti evitare di usare la malloc

Oceans11
22-01-2014, 22:32
Anche in questo esercizio vedo un sacco di malloc ma niente free ...

Se non c'è lo stesso numero di malloc e di free, allora hai un memory leak

Memory leak innocui in programmi tipo questo, che non è un demone ne un server. Ricordo che all'uscita del programma si occupa il s.o. di liberare la memoria allocata.

Ad ogni modo, è indubbiamente utile imparare a liberare la memoria allocata dinamicamente.

bancodeipugni
23-01-2014, 10:50
sperando che lo faccia

se è un approccio didattico pero' sarebbe bene imparare a farlo subito