blog personale

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.

 

2 Responses to “Linguaggio C -> stdio.h -> scanf(”%c”)”

  1. 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 ;)

  2. 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

Comment RSS · TrackBack URI

Leave a comment

Name: (Required)

E-mail: (Required)

Website:

Comment:

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word


 

Ultimi post

About Me

Blog tecnico/geek di Elvis. Chi sono ? studente & web developer freelance. Vedi la pagina "about me" per altre info.

scontiPHP