Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - getchar() Ignorato
Forum - C/C++ - getchar() Ignorato

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 19:12
Giovedì, 11/11/2010
Salve, sto facendo un vile programmino che converte da decimale a binario.
Finita la conversione il ciclo ricomincia, ma in teoria prima dovrebbe essere premuto INVIO..solo che getchar viene completamente ignorato infatti il programma continua ad andare avanti senza mostrare il risultato..

Codice sorgente - presumibilmente Delphi

  1. #include <stdio.h>
  2.  
  3. int main() {
  4.     int num, div, i = 0, conv[32];
  5.     do
  6.     {
  7.         system("clear");
  8.         printf("Conversioni da decimale a binario.\n");
  9.         printf("Per terminare inserire -1.\n");
  10.         printf("Le conversioni verranno rappresentate a 32 bit.");
  11.         printf("\n\nInserisci un numero: ");
  12.         scanf("%d", &num);
  13.         if(num>=0)
  14.         {
  15.             div = num;
  16.             while(i<32)
  17.             {
  18.                 conv[i] = div % 2;
  19.                 div /= 2;
  20.                 i++;
  21.             }
  22.             i--;
  23.             printf("Il risultato della conversione è: ");
  24.             while(i>=0)
  25.             {
  26.                 printf("%d", conv[i]);
  27.                 i--;
  28.             }
  29.             printf("\n\nPremi INVIO per continuare...");
  30.             getchar();
  31.         }
  32.         if(num<-1)
  33.         {
  34.             printf("Hai inserito un numero non valido!");
  35.             printf("\n\nPremi INVIO per continuare...");
  36.             getchar();
  37.         }
  38.     } while(num!=-1);
  39.     system("clear");
  40.     return 0;
  41. }


PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 19:27
Giovedì, 11/11/2010
Testo quotato

Postato originariamente da Luk3:

Salve, sto facendo un vile programmino che converte da decimale a binario.
Finita la conversione il ciclo ricomincia, ma in teoria prima dovrebbe essere premuto INVIO..solo che getchar viene completamente ignorato infatti il programma continua ad andare avanti senza mostrare il risultato..

Codice sorgente - presumibilmente Delphi

  1. #include <stdio.h>
  2.  
  3. int main() {
  4.     int num, div, i = 0, conv[32];
  5.     do
  6.     {
  7.         system("clear");
  8.         printf("Conversioni da decimale a binario.\n");
  9.         printf("Per terminare inserire -1.\n");
  10.         printf("Le conversioni verranno rappresentate a 32 bit.");
  11.         printf("\n\nInserisci un numero: ");
  12.         scanf("%d", &num);
  13.         if(num>=0)
  14.         {
  15.             div = num;
  16.             while(i<32)
  17.             {
  18.                 conv[i] = div % 2;
  19.                 div /= 2;
  20.                 i++;
  21.             }
  22.             i--;
  23.             printf("Il risultato della conversione è: ");
  24.             while(i>=0)
  25.             {
  26.                 printf("%d", conv[i]);
  27.                 i--;
  28.             }
  29.             printf("\n\nPremi INVIO per continuare...");
  30.             getchar();
  31.         }
  32.         if(num<-1)
  33.         {
  34.             printf("Hai inserito un numero non valido!");
  35.             printf("\n\nPremi INVIO per continuare...");
  36.             getchar();
  37.         }
  38.     } while(num!=-1);
  39.     system("clear");
  40.     return 0;
  41. }



Probabilmente e' a causa della lettura bufferizzata di scanf. Infatti prima del getchar tu prendi in input il numero da convertire e di conseguenza premendo invio rimane nel buffer il carattere newline(\n).
Prova utilizzando la fflush sull'stdin che dovrebbe forzare l'azzeramento del buffer.  
Codice sorgente - presumibilmente Plain Text

  1. ...
  2. fflush(stdin);
  3. getchar();
  4. ...


Oppure scrivi una cosa di questo tipo:
Codice sorgente - presumibilmente C/C++

  1. ...
  2. while (getchar() != '\n');


Ciao GuglielmoS.

Ultima modifica effettuata da GuglielmoS il 12/11/2010 alle 16:25
PM Quote
Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 20:07
Giovedì, 11/11/2010
No, non va neanche così u.u

PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 20:08
Giovedì, 11/11/2010
getchar non viene ignorato, solo che nel buffer era presente l'invio di prima (quello che hai premuto dopo aver inserito il numero)
inserisci due getchar(); e risolvi il problema=)

PM Quote
Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 20:21
Giovedì, 11/11/2010
Così funziona :) GRAZIE

PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 20:28
Giovedì, 11/11/2010
di niente :k:

PM Quote
Avatar
Giarados (Ex-Member)
Pro


Messaggi: 69
Iscritto: 25/07/2010

Segnala al moderatore
Postato alle 21:12
Giovedì, 11/11/2010
A me hanno insegnato ad usare
Codice sorgente - presumibilmente Plain Text

  1. __fpurge(stdin);



Ma è migliore la soluzione di Alex!

PM Quote
Avatar
Numa Pompilio (Ex-Member)
Pro


Messaggi: 66
Iscritto: 03/05/2010

Segnala al moderatore
Postato alle 21:13
Giovedì, 11/11/2010
Testo quotato

Postato originariamente da Alex:

getchar non viene ignorato, solo che nel buffer era presente l'invio di prima (quello che hai premuto dopo aver inserito il numero)
inserisci due getchar(); e risolvi il problema=)



per una soluzione "generale", cioè riutilizzabile in ogni circostanza, ti conviene usare un ciclo

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 15:25
Venerdì, 12/11/2010
Due chiamate a funzione sono molto brutte. Usa questo ciclo while prima di ogni chiamata a getchar
Codice sorgente - presumibilmente C/C++

  1. while (getchar() != '\n');



Questo ciclo svuota tutto il buffer fino al carattere new-line

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo