Finalmente dopo molti tentativi e discussioni tra me e Raffaello (compagno di univ) abbiamo scoperto perchè la funzione di libreria scanf del linguaggio C non si comporta come sembra o come riportato sui manuali.
Prendiamo il codice
char c;
scanf("%c", &c);
Sembra tutto a posto, infatti stampando poi la variabile c, si vede veramente il carattere digitato in console.
Ma:
char c;
do {
scanf("%c", &c);
}
while(c==’n');
dovrebbe continuare a chiedere un input finchè digitiamo n, invece esce subito anche digitanto esattamente ‘n’ !!!
Spiegazione: scanf mappa sulla stringa formato tutto il contenuto della stringa di input, compreso il newline alla fine ! strano, visto che la scanf necessita dell’andata a capo per terminare l’acquisizione e dovrebbe scartarlo visto che è sempre presente.
Nel caso del ciclo while sopra, in realtà nella locazione di memoria della variabile c nn è presente esattamente il carattere digitato, ma il carattere digitato e (magia ! ) il carattere di newline che viene considerato al secondo ciclo.
Soluzione:
scanf("%c\n", &c);
In questo modo il char digitato va a finire esattamente nella variabile c senza problemi e senza magiche aggiunte.
Il problema ovviamente non si pone con la stringa formato "%d" visto che "\n" è tralasciato per valori interi.



Andrea
on November 15 2008
Mi è stato utilissimo questo post, ma c’è un errore:
non è
scanf(”%c\n”,&blabla)
ma è
scanf(”\n%c”,&blabla)
(sennò memorizza la newline e basta in blabla
bye
admin
on November 17 2008
non ho capito la tua osservazione.
quando acquisisci da shell, prima metti il carattere poi premi INVIO, quindi il pattern in entrata è: prima il carattere, poi newline.
quindi
scanf(”%c\n”, &c);
è corretto