2013-09-02 14 views
5

Im folgende Stück Code, was while-Schleife zu tun (markiert mit „loop“): -?Was passiert hier im Code?

int main(void) 
{ 
    char code; 

    for (;;) 
    { 
     printf("Enter operation code: "); 
     scanf(" %c", &code); 
     while (getchar() != '\n') // loop 
      ; 
     switch (code) 
     { 
     case 'i': 
      insert(); 
      break; 
     case 's': 
      search(); 
      break; 
     case 'u': 
      update(); 
      break; 
     case 'p': 
      print(); 
      break; 
     case 'q': 
      return 0; 
     default: 
      printf("Illegal code\n"); 
     } 
     printf("\n"); 
    } 
} 

Disclaimer: Der Code ist nicht vollständig, es ist nur ein Teil des Codes, da davon gewannen sie nicht kompilieren.

+4

Es wiederholt wiederholt 'getchar()' ... was hat * Sie * denken, dass es getan hat? –

+1

Sehen Sie zum Beispiel http://Stackoverflow.com/a/13710915/613130 ​​für einige Tricks mit 'scanf' – xanatos

+0

@xanatos danke für den Link. – chanzerre

Antwort

8

getchar() hier verwendet, um die zusätzlichen Zeichen aufessen\n durch Benutzer und das Newline-Zeichen eingegeben.
ein Benutzer Angenommen, der Operationscode als

isupq\n // '\n' is for "Enter" button 
dann

eingegeben würde scanf() nur Charakter i und der Rest der fünf Zeichen lesen die scanf() wird für die nächste Iteration

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

So

Aussage verbraucht werden würde Warten Sie, bis der Benutzer ein Zeichen eingibt, anstatt es aus dem Eingabepuffer zu lesen.

+0

Warum überspringt der Compiler hier Aufrufe der Funktion scanf()? Was ist falsch in diesem Code? Was ist die Lösung? Siehe hier: http://ideone.com/txlQm8 – Destructor

+1

@PravasiMeet; In der Funktion 'getdata' liest' fgets' in der zweiten Iteration '' n '' von 'scanf'. Setzen Sie eine Anweisung 'getchar();', um den Zeilenumbruch aufzubrauchen.http: //ideone.com/Dap2Bj – haccks

0

scanf() ist in der Regel keine gute Möglichkeit, char Variablen zu scannen, da die Enter-Taste nach Eingabe des Zeichens im Eingabepuffer bleibt. Das nächste Mal, wenn Sie scanf("%c", &input) anrufen, wird dieses Enter, das bereits im Puffer vorhanden ist, gelesen & zugewiesen zu Eingang und überspringt so die nächste Eingabe vom Benutzer.

5
while (getchar() != '\n') // loop 
; 

ist hier, um den Puffer zu reinigen.

Das Problem, dass dies während löst, ist, dass scanf(" %c", &code); nur ein einzelnes Zeichen aus dem Eingabepuffer ergreift. Das wäre in Ordnung, außer dass es noch einen neuen Zeilenumbruch im Eingabepuffer gibt, der aus dem Drücken von "Enter" nach Ihrer Eingabe resultiert. Für den Eingabepuffer wird ein Puffer löschen benötigt. das ist, was die while-Schleife

tut es ist ein häufiges Problem mit c

+1

-1 für 'fflush (stdin)'. – jrok

+0

@jrok erklären –

+3

Es ist undefiniertes Verhalten. – jrok

0

Hier wartet die Anwendung für den Benutzer die Eingabetaste zu drücken.

0

Da die for Schleife in dem angegebenen Code eine Endlosschleife ist, so überprüft die while Schleife, ob das Eingabezeichen \n oder nicht ist. Wenn das eingegebene Zeichen \n ist, bewegt es sich dann zum Schaltergehäuse. Im allgemeinen Sinn wartet auf die Return-Taste, um Ihre Eingabe zu bestätigen.

0

Wenn Sie die Funktion fgetc verwenden, müssen Sie sich keine Sorgen machen und nach der Eingabetaste in Ihrer Endlosschleife suchen. Selbst wenn Sie mehr als ein Zeichen eingeben, dauert es nur die erste

int main(void) 
{ 
char code; 

for (;;) 
{ 
    printf("Enter operation code: "); 
    code = fgetc(stdin); 

    switch (code) 
    { 
    case 'i': 
     insert(); 
     break; 
    case 's': 
     search(); 
     break; 
    case 'u': 
     update(); 
     break; 
    case 'p': 
     print(); 
     break; 
    case 'q': 
     return 0; 
    default: 
     printf("Illegal code\n"); 
    } 
    printf("\n"); 
} 
} 
Verwandte Themen