|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
[C] Funzione con valore sentinella non rilevato
Salve a tutti, mi potreste dire cosa c'è di errato in questa funzione?
Codice:
void digitaVettore (char v[]) { int i=0; printf ("Digita una serie di caratteri (numeri, lettere e simboli); " "inserisci il carattere '!' per terminare.\n"); do { scanf ("%s", &v[i]); i++; } while (v[i] != '!'); i=0; printf ("Ecco la stringa inserita:\n"); while (v[i] != '!') { printf ("%s", v[i]); i++; } } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Perche' quando arrivi a valutare
Codice:
} while (v[i] != '!');
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Vero, mi era sfuggito. Ti ringrazio!
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per leggere caratteri si usa %c, non %s.
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Ti ringrazio, funziona. Ma sinceramente non mi è molto chiara la differenza tra i due.
Perchè devo utilizzare %c e non %s. Quando avrei potuto utilizzare %s? EDIT Nel caso del programma in questione vorrei far notare che devo inserire lettere, numeri e simboli. Ultima modifica di Composition86 : 07-11-2008 alle 11:15. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Un carattere con scanf si legge con %c e non con %s, con %s si legge una stringa fino all'invio. Sinceramente non capisco perché funzionasse prima. Dovrebbe andare in ciclo infinito fino a fare un buffer overflow. |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Credo di aver capito la differenza, mi ero perso un paio di cose, faccio un elenco, potrà servire a qualcuno che fa una ricerca nel forum:
-la funzione gets(vettore) legge una stringa fino al primo invio. -scanf(%s, vettore) legge fino al primo invio, spazio o tabulazione. -lettura carattere per carattere, metodo decisamente scomodo. Riguardo al tuo "dubbio", non so neanche io perchè prima funzionasse, forse avevo lasciato qualche %c o %s non voluto. |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Per avere un stdin non bufferizzato - leggi: premo un carattere, il programma legge il carattere e su questo carattere posso eseguire subito delle operazioni prima della lettura successiva - si può avere solo con librerie non standard o comunque dipendenti dal sistema operativo. |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jul 2005
Messaggi: 406
|
Ti ringrazio ancora, ho capito.
Però mi è venuto un altro dubbio a proposito di %c e %s, devo leggere una variabile di tipo char (quindi nelle dichiarazioni ho "char carattere"); uso questa operazione: scanf ("%c", &carattere); In lettura devo mettere %s al posto di %c per farlo funzionare (e non me lo spiego), mentre se voglio stampare il carattere devo mettere %c e non %s, altrimenti il programma si blocca. Ultima modifica di Composition86 : 07-11-2008 alle 14:46. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:35.