|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
devo leggere una stringa con scanf....
allora...il problema è il seguente...
quando leggo una stringa con scanf("%s",stringa); la scanf mi legge dallo stdin la sequenza di caratteri fino allo spazio e poi ci mette un \0 alla fine nelle stringa......ma se tipo voglio inserire una stringa con più parole separate da uno spazio? come devo fare? c'è qualcuno che ha già affrontato questo problema e magari l ha risolto? avevo pensato tipo a gets ma durante la compilazione mi dice che gets non deve essere utilizzata!? ![]() aiutoooooooo! ![]()
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... ![]() |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
strano che legga fino allo spazio, io mi ricordavo di aver affrontato problemi simili a programmazione 1, ma mi sembrava che leggesse tutto fino al newline...
cmq non vedo perché gets non dovrebbe essere utilizzata: noi a prog 1 l'abbiamo usata e i nostri programmi sono stati compilati su Linux senza problemi ![]() (inutile dire che io i miei li ho testati sempre su Windows, quindi dovrebbe andar bene su entrambi i sistemi operativi) cosa dice esattamente il warning del compilatore quando usi gets? sei sicuro di aver incluso la libreria in cui è dichiarata? |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2005
Messaggi: 118
|
La gets ha il problema di non controllare la lunghezza della stringa che viene effettivamente data in input, quindi viene sconsigliata in quanto può causare problemi di buffer overflow.
![]() Per leggere una stringa è possibile utilizzare la funzione fgets , alla quale deve essere passata anche la lunghezza massima della stringa (effettivamente ho riscontrato anche io gli stessi problemi con la scanf, ma sinceramente non so se c'è un modo per risolverli)... |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
prova ad usare la scnaf così:
scanf(" %[^\n]",str); devi lasciare uno spazio davanti al % |
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
scanf("%s", s); ![]() ![]() ![]() ![]() |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
se compili sotto Linux con gcc, è il compilatore stesso che come warning ti avvisa che non dovresti usare la gets. Il problema di sicurezza della gets e del buffer overflow, è che non puoi in nessun modo controllare la lunghezza della stringa che prendi. Non a caso, l'uso ne è vivamente sconsigliato su moltissimi testi, e non a caso, gcc dice vivamente di non usarla ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#7 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#8 | |||
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Quote:
Quote:
Questo per leggere qualunque stringa.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Feb 2000
Città: Grugliasco, Torino
Messaggi: 175
|
scanf("%[A-Za-Z0-9 ]", %s);
Con questo prendi tutti i caratteri che cono lettere maiuscole, minuscole, numeri e spazi ![]() Se ti servono altri caratteri, come la punteggiatura, aggiungili all'interno delle parentesi quadre :9 |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 1999
Città: Milano
Messaggi: 531
|
ho fatto questa routine e sembra funzionare...
Codice:
int leggi_stringa(char *stringa,int n){ char ch; /*caratte di lettura */ int i=0; /*contatore di stringa*/ if (!stringa) return(-1);/*nel caso in cui la stringa non era stata allocata*/ if (fflush(stdin)==EOF) printf("c'e' stato un errore nella pulizia dello stdin\n"); /*questa funzione a volte basta a pulire lo stdin altre volte lo stdin si pulisce solo con il metodo adottato successivamente*/ /*leggo da stdin fino a che non leggo un newline, newline precedenti verranno ignorati grazie all'utilizzo del controllo i=0*/ while(((ch=getchar())!='\n')&&(i<n)||(i==0)){ if (ch!='\n'){stringa[i]=ch; i++;}/*se non sono una fine stringa memorizza in stringa[i]*/ } if (i==n){ /*controllo l'overflow, in tal caso ho troncato lo stdin*/ while(getchar()!='\n');/*svuoto lo stdin di caratteri immondizia*/ stringa[n-1]='\0'; return(-2); } if (i+1==n) i--; stringa[i+1]='\0'; return(0); } nel caso in cui ci siano newline vecchi nello stdin e cose vecchie pulisco lo stdin che ne dite?
__________________
Vintage signature: Abit nf7-s, Xp 2500+@2300mhz, 256 mb 418mhz cas2, geforce fx5700,S-ATA 160 Maxtor,Lg gsa 4120b...prima..ma ora..DELL INSPIRON 6400, ATI X1300... ![]() |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 1101
|
prova ad usare fflush(stdin)
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2003
Città: Pordenone - Tarvisio
Messaggi: 2451
|
Usa la fgets che è piu sicura (mi è stata consigliata qua sul forum)
Codice:
fgets(stringa,MAXBUFF,stdin);
__________________
Me? The Chosen One? They chose me, and i didn't even graduate from fuckin' high school Wind FTTE Vula 100/20 - Stats Retelit / Valcanale 20Mbit/2Mbit // Wind 100/20+Wind4G con EdgerouterX |
![]() |
![]() |
![]() |
#14 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
E che ch deve essere un int, e non un char (getchar può restituire EOF, che è un valore int diverso da qualunque char).
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:41.