2015-04-07 12 views
5

Ho scritto questo semplice programma per la pratica:Perché questa frase è stampata due volte nel ciclo while?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define CLASSES 3 
#define STUDENTS 4 
int grades[CLASSES][STUDENTS]; 

int main(void) 
{ 
    int i = 1; 
    char t,k; 
    while(i == 1) 
    { 
     printf("\n\n\nMENU:\nEnter the grades(E)\nReport Grades(R)\nQuit(Q)\nYour choice: "); 
     k = toupper(getchar()); 
     printf("Input entered... %c\n", k); 
     switch(k) { 
      case 'E' : 
       printf("Entering the grades..\n"); 
       break; 
      case 'R' : 
       printf("Reporting the grades...\n"); 
       break; 
      case 'Q' : 
       printf("Quitting the program...\n"); 
       exit(0); 
       break; 
      default: 
       printf("ERROR: %c: Incorrect menu option\n", k); 
       break; 
     } 

    } 
    return 0; 
} 

Quando ho eseguito questo, prima mi chiede di entrare in una scelta. Se inserisco 'E' o 'R', va nel rispettivo blocco 'caso' ma nella prossima iterazione all'interno del ciclo while, non aspetta che entri nella mia scelta. Invece presuppone che io abbia inserito "NULL" e chiedo il mio prompt per la terza volta. Questo continua a succedere ogni volta che entro in una scelta. Ecco l'output di questo programma. Cosa mi manca qui?

host-mb:c_practice host$ ./asd 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: E 
Input entered... E 
Entering the grades.. 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: Input entered... 

ERROR: 
: Incorrect menu option 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: R 
Input entered... R 
Reporting the grades... 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: Input entered... 

ERROR: 
: Incorrect menu option 



MENU: 
Enter the grades(E) 
Report Grades(R) 
Quit(Q) 
Your choice: Q 
Input entered... Q 
Quitting the program... 
host-mb:c_practice host$ 
+2

Perché si è premuto e, quindi premuto invio. Sono due personaggi. – immibis

+0

'k = touper (getchar());' -> 'k = touper (getchar()); getchar();' uno per newline. – BLUEPIXY

risposta

10

Questo succede perché si digita una lettera e quindi si preme invio. Utilizzare un altro getchar() per mangiare la nuova riga finale.

Quindi cambiare questo:

k = toupper(getchar()); 

a questo:

k = toupper(getchar()); 
getchar(); // eat the trailing newline 

Quando l'input dell'utente qualcosa, va alla (standard input) flusso stdin e il sistema fa in modo di conservare ciò che l'utente ha digitato in un buffer interno. Così qui è quello che è successo con il tuo codice :

enter image description here

Quindi la soluzione è quella di mangiate la finale a capo!


Uova di Pasqua punte:

si dovrebbe ricevere questo:

warning: implicit declaration of function ‘printf’ 

perché ti manca della testata IO, in tal modo si dovrebbe aggiungere nella parte superiore del vostro file di questo formato:

#include <stdio.h> 

Analogamente, è necessario aggiungere:

Un'altra soluzione sarebbe quella di utilizzare fgets(), vedere questa domanda per ulteriori C - scanf() vs gets() vs fgets().


Ho avuto un problema simile al tuo con scanf() ed ero nei tuoi panni, così mi aveva scritto il solution al momento.

+0

Questo ha aiutato. Grazie. Quindi ogni volta che aspetto un "invio" da parte dell'utente, ho bisogno di mangiarlo usando getchar(). – gixxer

+0

Esattamente! Bella cattura e bella domanda, hai il mio +1. @gixxer – gsamaras

+0

Suppongo che ci sia un'altra soluzione, invece di usare getchar() 2 volte, posso usare gets() e rimuovere "\ n" dall'input. – gixxer