2016-11-20 6 views
1

Der Benutzer hat nur zwei Möglichkeiten "a" oder "b", wenn die Benutzereingabe nicht "a" oder "b" ist, sollte eine Fehlermeldung sie nur zur Eingabe von "a" oder "" auffordern b '.Eingabevalidierung: Überprüfung mehrerer Werte

DAS GUTE: Ich gebe den Buchstaben 'a' ein und es umgeht die While-Schleife.

DIE SCHLECHTE: Wenn ich 'b' eingeben, wird die While-Schleife nicht umgangen?

Irgendwelche Vorschläge zur Behebung dieses Problems?

#include <stdio.h> 
int main(void) 
{ 
    char c; 

    printf("enter a or b to make it out!\n"); 

    //loop if answer is NOT a or b 
    while ((c = getchar() != 'a') && (c = getchar() != 'b')) 
    { 
     //let the user know there has been a problem! 
     printf("That value is invalid"); 
     printf("\nPlease enter a or b:\n"); 
     fseek(stdin,0,SEEK_END); 
    } 

    printf("You made it out!"); 
    return 0; 
} 
+0

Sie zwei Zeichen lesen, denn Sie rufen getchar' zweimal. Am Ende nimmst du auch das Newline-Zeichen '\ n'. Wenn Sie also a eingeben, wird 'c = getchar()! = 'A'' zu false ausgewertet und die Schleife wird übersprungen (ich denke, dass die zweite Bedingung aufgrund von Kurzschlüssen übersprungen wird). Aber wenn Sie b, "b"! = "A" und "\ n"! = "B" eingeben, tritt es in die while-Schleife ein. Außerdem bin ich ziemlich sicher, dass dies als 'c = (getchar()! = 'A') ausgeführt wird, was vermutlich nicht das ist, was Sie erwarten. –

+0

Danke Millie! –

Antwort

1

Jedes Mal, wenn Sie eine getchar() ein _different_ Charakter tun wird gelesen. So ermitteln Sie die while Schleife als

while (((c = getchar()) != 'a') && (c != 'b')) 

Ansonsten c = getchar() != 'b' wird geprüft, wird c, wenn die Bedingung \n sein ändern sollten.

Was mehr ist, sollten Sie das \n aus dem Weg bekommen. Sie können also in Ihrer while Schleife einen weiteren getchar() hinzufügen, dessen Rückgabewert Sie nicht benötigen.

+0

Danke elikatsis! –

1

mehrere Probleme:

  • c = getchar() != 'a' speichert nicht den Charakter lesen in c, es liest und verwirft den Charakter und speichert das Ergebnis des Vergleichs in c.

  • Sie sollten den Wert des gelesenen Zeichens testen, anstatt ein zweites Zeichen zu lesen.

  • Sie sollten auch für Ende prüfen, ob Datei, und verwenden Sie ein intEOF für alle Werte von unsigned char und den besonderen Wert zu ermöglichen.

  • stdin Zurückspulen weitere Bytes zu lesen, wird nicht produzieren, was Sie erwarten: entweder es gelingt, und Sie werden noch einmal lesen kann das gleiche Bytes oder es nicht ist stdin ungepufferte ist und an ein Gerät gebunden.

Versuchen Sie folgendes:

#include <stdio.h> 

int main(void) { 
    int c; 

    printf("enter a or b to make it out!\n"); 

    //loop if answer is NOT a or b 
    while ((c = getchar()) != EOF && c != 'a' && c != 'b') { 
     //let the user know there has been a problem! 
     printf("That value is invalid"); 
     printf("\nPlease enter a or b:\n"); 
    } 
    printf("You made it out!\n"); 
    return 0; 
}