Newsgroup: it.comp.lang.c
Titolo: while{

Scusate, vi scrivo perché mi è capitata una cosa un p' strana scrivendo un
programma (uso l'lcc su win 98):
ho scritto
char s='?';
while (s!='m' && sesso!='f'){
  printf("\n\nSesso ('m' maschio, 'f' femmina):  ");
  scanf("%c", &s);
 }
Mi sembra giusto.
Però scrive ogni volta (sia la prima che ogni altra volta che si immette il
carattere sbagliato) due volte il contenuto di printf!
Non ho capito perché, e se qualcuno potesse aiutrmi gli sarei grato.
Ciao,
Zeppe

 while (s!='m' && sesso!='f'){
                                   ^
                                    |
non e' che hai scritto male vero? 
 e <sesso> intendo

Mi sembra giusto.
non lo e' ! ;)
Il problema e' dovuto a scanf() che lascia caratteri nel buffer di
input.
prova a scrivere :
char s='?';
while (s!='m' && sesso!='f')
{
  char c ;
  printf("\n\nSesso ('m' maschio, 'f' femmina):  ");
  scanf("%c", &s) ;
  while ( ( c = getchar() ) != '\n' ) ;
}
oppure usa i flag di formato di scanf() per leggere tutti i caratteri
rimasti nel buffer...
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------

 carattere sbagliato) due volte il contenuto di printf!
Un classico. C'è anche nella FAQ che stiamo preparando. Devi svuotare il
buffer dopo ogni lettura con
while ( getchar() != '\n' );
o simili.
EMG

non e' che hai scritto male vero? 
 e <sesso> intendo
Sě, certo!
Č che stavo provando varie modifiche, e allla fine č rimasto cosě!
Ciao,
Zeppe

o simili.
Grazie, e vero!
Stavo pensando a qualcosa del genere, ma siccome non sono troppo abile, non
ho capito subito di che cosa si trattasse!
Ciao,
Zeppe

 Mi sembra giusto.
Non direi. Così è un po' meglio:
        char s = '?';
        while (s != 'm' && s != 'f') {
                char c;
                fputs("\nSesso ('m' maschio, 'f' femmina):  ", stdout);
                if ((scanf("%c", &s) == 1) && (s != '\n'))
                        if (scanf("%*[^\n]%c", &c) == 0)
                                scanf("%c", &c);
        }
scanf(), a causa della sua rigidità, non è generalmente la 
scelta migliore per gestire l'input.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

scelta migliore per gestire l'input.
Purtroppo la mia conoscenza del C non č molto vasta per cui non ho capito
molto che cosa hai fatto. Forse mi dovrebbe rassicurare il fatto che l'ho
provato e funziona esattamente come il mio? ;-)
Seriamente, non funziona, ma che cosa dovrebbe fare il programma?
Altri mi hanno suggerito di svuotare il buffer aggiungendo al mio codice,
alla fine,
while (getchar()!='\n');
ma non ha funzionato, perché semplicemente, anziché limitarsi a stampare due
volte la domanda, chiede anche due volte la risposta!
Lo so che rompo, ma perché fa cosě?!?!?
Grazie,
Zeppe

 volte la domanda, chiede anche due volte la risposta!
Non conosco il tuo compilatore, ma _forse_ potrebbe essere che non riconosca
correttamente il '\n' (si, pare una scemenza anche a me ;).


correttamente il '\n' (si, pare una scemenza anche a me ;).
È l'lcc, ma credo che il problema fosse dato da scanf precedenti!
Ora che ci penso tu dovresti usare linux, o almeno questo messaggio lo hai
scritto da linux, quindi non so se lo conosci, l'lcc.
Ciao,
Zeppe

Non ti seguo: scritto dove ?
Nello scanf, intendo.
Non sono riuscito a capire che cosa facesse!
Grazie,
Zeppe

 carattere sbagliato) due volte il contenuto di printf!


 Non sono riuscito a capire che cosa facesse!
Intendi 
        if ((scanf("%c", &s) == 1) && (s != '\n'))
                if (scanf("%*[^\n]%c", &c) == 0)
                        scanf("%c", &c);
?
Be', ma...è autoesplicativo! 8)
Comunque:
1) legge 1 carattere, lo mette in s, se è diverso da '\n'...
2) tenta di leggere 1 o più caratteri diversi da '\n', seguiti da un 
   altro carattere (questo serve a svuotare il buffer di input). 
   Se però il buffer di input contiene solo il '\n' finale, la scanf
   fallisce ritornando 0, e lasciando il '\n' nel buffer, quindi...
3) legge il '\n'.


...
Intendi
        if ((scanf("%c", &s) == 1) && (s != '\n'))
                if (scanf("%*[^\n]%c", &c) == 0)
                        scanf("%c", &c);
?
Be', ma...è autoesplicativo! 8)
Spero non dicessi sul serio !   ^___^;