PDA

View Full Version : [C] Gestire stringhe multiparola in C


AnonimoVeneziano
04-09-2004, 22:51
Ciao, mi trovo con uno stupido ma astioso problema.

In C ho sempre usato "scanf" come funzione per gestire in input tutti i tipi di dato possibile , ma mi sono trovato un po' confuso quando oggi , facendo un programmino d'allenamento per la gestione di alcune strutture di dato come liste concatenate, pile, code e alberi binari, ho scoperto che se si da in pasto a "scanf" una stringa multiparola (come ad esempio "Ciao Mondo", composta da 2 parole ) al primo spazio ci piazza un bel '\0' e tanti saluti!! Insomma , il mio "Ciao Mondo" diventa solo un "Ciao" .

A me sembra una grossa limitazione sinceramente!!

Ho cercato una funzione alternativa, e ho trovato "gets", ma gcc mi invia un inquietante messaggio alla compilazione :


melchior@melchior:~/Cprograms$ gcc -g stack.c -o stack
/tmp/ccJzP4My.o(.text+0x3e): In function `main':
/home/melchior/Cprograms/stack.c:21: warning: the `gets' function is dangerous and should not be used.


Penso perchè "gets" non fa il controllo dell' overflow e cerca di andare avanti a scrivere anche quando non c'è + memoria allocata (correggetemi se sbaglio) .

A questo punto come faccio a prendere in input una stringa multiparola?? Datemi un consiglio .

Grazie

Ciao

maxithron
04-09-2004, 23:25
Ciao AnonimoVeneziano :)

Gets è una funzione molto pericolosa da utilizzare perchè non permette di stabilire l'esatto numero di caratteri da assegnare quindi l'ideale per "annidare" un buffer overflow.

Devi usare fgets al posto di gets.

AnonimoVeneziano
04-09-2004, 23:30
Dopo un po' di spulciamento tra i man avevo già trovato "fgets" :D

Grazie comunque max :p

Ciao

Fenomeno85
04-09-2004, 23:44
scusate quindi supponiamo che ho un array


char array[20];


è meglio questa:


fgets(array,20,??);


che questa?


gets(array);


due domande:
1) la grandezza va contata già con il fine parola oppure no??
2) che ci metto al posto dei punti di domanda?? stdin??


~§~ Sempre E Solo Lei ~§~

AnonimoVeneziano
05-09-2004, 00:15
meglio :

fgets(array, 20, stdin);

Ciao

maxithron
05-09-2004, 00:31
il prototipo comunque è eloquente:

char *fgets(char *str, int n, FILE *fp)

AnonimoVeneziano
05-09-2004, 00:44
man fgets RULEZ :D

Ciao

Dun
05-09-2004, 00:52
Che ne dici di questa:

scanf("%[^\n]", arr);


:D :D :D

Fenomeno85
05-09-2004, 10:26
Originariamente inviato da AnonimoVeneziano
meglio :

fgets(array, 20, stdin);

Ciao

ottimo :D

così si evitano brutti overflow giusto?!

~§~ Sempre E Solo Lei ~§~

Fenomeno85
05-09-2004, 10:38
ok mi autorispondo :D ... è molto meglio usare questo metodo :D

quante cose che si imparano :D

~§~ Sempre E Solo Lei ~§~