- Messaggi: 105
- Ringraziamenti ricevuti 5
Problema con la funzione getchar()
Dopo aver chiesto sul forum un consiglio su quale IDE utilizzare, ho optato per wxDev-C++, quindi ho scaricato ed installato il programma, l'ho aperto e ho buttato subito giù 2 righe per vedere se ricordavo almeno come prendere dei numeri da imput e poi stampare il risultato di alcune operazioni a video ( dopo 2 anni senza scrivere un rigo, già fare questo sarebbe stata una vittoria )
#include <stdio.h>
main(){
int a, b, somma, prodotto;
printf("Inserire un primo numero: \n");
scanf("%d", &a);
printf("Inserire un secondo numero: \n");
scanf("%d", &b);
somma=a+b;
prodotto=a*b;
printf("SOMMA: %d \n", somma);
printf("PRODOTTO: %d \n", prodotto);
getchar();
}
Compilo il programma, ricevo un messaggio che mi conferma che il tutto va bene e quindi lo eseguo, inserisco il primo numero e premo invio, inserisco il secondo numero e premo invio, neanche un secondo e si chiude tutto.
A questo punto iniziano i miei problemi, subito penso: " ma la getchar() alla fine non serve a bloccare l'esecuzione del programma in attesa della pressione di un tasto? strano..... " allora subito mi metto alla ricerca per cercare di capire il motivo di questo strano comportamento e dopo aver girovagato su qualche sito arrivo alla seguente conclusione:
Ogni volta che viene premuto un tasto, il carattere corrispondente viene inserito in un'opportuna area di memoria, chiamata buffer, poi quando viene eseguita una scanf, i caratteri vengono letti dal buffer e portati nella variabile che deve essere letta, quindi, quando inserisco da tastiera il secondo numero (b), siccome prima premo i tasti corrispondenti alle cifre (ad esempio, 30), e poi batto il tasto "invio", nel buffer vengono scritti 3 caratteri: '3' '0' ed invio, dove il carattere '3' e lo '0' vengono convertiti in numero intero ed assegnati alla variabile b, invece il carattere invio rimane nel buffer.
A questo punto la getchar() inserita alla fine si va a prendere lei il carattere invio ed è questo il motivo per il quale il programma non si blocca ad aspettare il mio invio finale .
Quindi è necessario un qualcosa per pulire il buffer da quell'invio che resta al suo interno, ed a tal fine ho utilizzato la funzione fflush(stdin) subito dopo l'ultimo scanf(), modificando in questa maniera il mio programmino:
#include <stdio.h>
main(){
int a, b, somma, prodotto;
printf("Inserire un primo numero: \n");
scanf("%d", &a);
printf("Inserire un secondo numero: \n");
scanf("%d", &b);
fflush(stdin);
somma=a+b;
prodotto=a*b;
printf("SOMMA: %d \n", somma);
printf("PRODOTTO: %d \n", prodotto);
getchar();
}
che adesso mi aspetta per permettermi di visualizzare il risultato
Morale della favola, penso di aver capito e risolto il problema, ora se il metodo da me utilizzato è giusto questo messaggio potrebbe in futuro essere utile a qualche utente del forum o esterno ,in caso contrario, ovvero se esistesse qualche altro metodo, sono tutte orecchie in quanto come da firma ho tanta voglia di imparare......
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mikysmcv
- Autore della discussione
- Premium Member
effettivamente il getchar() lo usavo quando dovevo leggere le opzioni multiple senza dover aspettare la pressione di un ritorno a capo.
tipo:
1) prima scelta
2) seconda scelta
altrimenti facevo uso di uno scanf di una char e scrivevo,
"Premi Q per uscire"
Il ripulire il buffer mi sembra un'alternativa valida.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.