2017-11-06 4 views
2

Ich habe eine function, die nur gültige Eingaben akzeptieren sollte. In diesem Fall wäre ein gültiger Eingang ein integer Wert größer Null und kleiner UCHAR_MAX. Im Falle einer ungültigen Eingabe sollte die [ERR] -Meldung in eine neue Zeile geworfen werden. Das Problem hierbei ist, dass, während es funktioniert Weise es sollte durch Zeichen, es funktioniert nicht so, wie es sollte, wenn die Werte außerhalb des definierten Bereichs sind (0 < input < UCHAR_MAX). Das bedeutet, wenn die Eingabe etwas wie -42 oder 1337 ist, macht es nach die [ERR] -Meldung eine zusätzliche Zeile und wartet auf eine andere "Eingabe".Warum produziert meine Funktion zusätzliche neue Zeilen?

Warum macht es eine zusätzliche neue Zeile, warten auf ein anderes "Enter", während es von Zeichen funktioniert und wie kann ich dieses Problem überwinden?

int get_int(void) 
{ 
    char lsc; // least significant char - stores the last char at scanf() 
    char correct_input = 'f'; // boolean value to exit the while-loop 
    int input = 0;   // stores the users input 
    int return_value = 0;  // stores the return value of scanf(); 

    while (correct_input == 'f') { 
    printf("Please enter an unsigend integer value greater zero: "); 
    return_value = scanf("%d%c", &input, &lsc); 

    if (return_value == 2 && lsc == '\n' && UCHAR_MAX > input && input > 0) 
    { 
     printf("[OK] Valid input.\n"); 
     correct_input = 't'; 
    } 
    else if (return_value == EOF) { 
     exit(0); 
    } 
    else 
    { 
     printf("[ERR] Invalid input!\n"); 
     while(getchar() != '\n'); // flushes the scanf()-buffer 
    } 
    } 
    return input; 
} 

resultierender Ausgang:

 
Please enter a unsigend integer value greater zero: foo 
[ERR] Invalid input! 
Please enter a unsigend integer value greater zero: 1337 
[ERR] Invalid input! 

Please enter a unsigend integer value greater zero: -42 
[ERR] Invalid input! 

Please enter a unsigend integer value greater zero: 5 
[OK] Valid input. 

Wie Sie sehen können darüber weitere neue Linien machen, wenn der Wert außerhalb des Bereichs liegt.

Ich bin dankbar für jede Hilfe, Links, Hinweise und Hinweise!

+0

Sie "spülen" auch wenn es nichts zu spülen gibt. Wenn Sie also eine Zahl eingeben, gefolgt von Newline, wartet das Programm auf eine weitere Zeilenschaltung. Ich empfehle 'fgets' und' sscanf' anstelle von 'scanf' – 4386427

+0

Im Falle der' foo' Eingabe wurde keine neue Zeile gelesen, im Falle von '1337' Eingabe hat es. –

+0

Warum brauchen Sie '& lsc' in 'scanf()'? –

Antwort

2

Schlüssel eingeben Also, warum es eine neue Zeile erzeugt, wenn der Wert außerhalb des Bereichs liegt?

Es wird keine neue Zeile mehr erzeugt; Es wartet auf Sie eine wegen der while(getchar() != '\n') eingeben.

wie kann ich dieses problem überwinden?

Überspringen Sie die while(getchar() != '\n'), wenn die neue Zeile bereits von scanf() gelesen wurde.

 if (return_value < 2 || lsc != '\n') // do only if \n not already read 
     while(getchar() != '\n'); // flushes the scanf()-buffer 
+1

Nun, jetzt sehe ich das Problem, Ihr Ansatz hat für mich funktioniert, danke! – PatrickSteiner

1

while(getchar() != '\n'); macht Ihr Programm zu warten,

+1

Das ist wahr, aber es macht seinen Job im Falle eines String/Char-Inputs wie 'foo' oder' 3bar'. Warum erzeugt es also eine neue Zeile, wenn der Wert außerhalb des Bereichs liegt? – PatrickSteiner

+1

Es ist weil, wenn Sie 'foo' eingeben, schlägt Ihr scanf fehl, da der erste Wert Ganzzahl sein sollte. Also '' foo' 'ist immer noch im Puffer und' 'getchar()' in, während 'foo' + newline nach 'foo' verbraucht wird und die Schleife durchbricht. Ähnlich wird für '3bar' 3 in' input' gespeichert und 'b' in' lsc' gespeichert und der Rest 'ar \ n' bleibt im Puffer übrig und wird von' while (getchar()! = '\ n' verbraucht)); 'und bricht nach dem Lesen Newline. Aber für '1337' ist der Wert in' input' gespeichert und der newline (wegen enter key) wird in 'lsc' gespeichert. Jetzt wird nichts mehr im Puffer bleiben, so dass es auf Eingabe in 'while (getchar()! = '\ N') wartet' – Karthick

Verwandte Themen