Problema con la funzione getchar()

12 Anni 3 Mesi fa - 12 Anni 2 Mesi fa #1 da mikysmcv
Problema con la funzione getchar() è stato creato da mikysmcv
Da qualche giorno ho ripreso libri e appunti utilizzati qualche annetto fa' per sostenere un esame sul linguaggio C, con l'obiettivo di riprendere tale linguaggio.
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 :lol: )

#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 :P

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......
Ultima Modifica 12 Anni 2 Mesi fa da mikysmcv.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • mikysmcv
  • Avatar di mikysmcv
  • Premium Member
  • Premium Member
Di più
12 Anni 3 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Problema con la funzione getchar()
Ciao,

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.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiStefA

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login