2012-04-10 7 views
3

Hier ist das Programm: 1 2 3 4 (dann eingeben drücken):Warum eingeben (neue Zeile) wird nicht von scanf verlassen?

#include "stdio.h" 

int main() 
{ 
    int minx, x, y, z; 

    printf("Enter four ints: "); 
    scanf("%i %i %i %i", &minx, &x, &y, &z); 

    printf("You wrote: %d %d %d %d", minx, x, y, z); 
} 

sagen, wenn ich wie folgt ein. Die scanf() läuft und liest den Eingabepuffer = 1 (Leerzeichen) 2 (Leerzeichen) 3 (Leerzeichen) 4 (Leerzeichen) (\ n) es liest bis (\ n) und \ n bleibt im Puffer.

Wenn ich Eingaben wie die folgenden: 1 (drücken dann eingeben) 2 (drücken dann eingeben) 3 (dann drücken eingeben) 4 (drücken dann eingeben). Die scanf() läuft und liest den Eingabepuffer = 1 (\ n) 2 (\ n) 3 (\ n) 4 (\ n) (\ n).

In diesen 2 Fällen überspringt der scanf() die Newline, Leerzeichen und versucht, eine int zu lesen.

Aber wenn ich 1 eingeben (drücken Sie dann eingeben) (drücken Sie dann eingeben) ... die scanf() dann läuft nie, wenn ich geben behalte das Schlagen.

Meine Frage ist: Was löst scanf() aus? Wird es nur laufen, nachdem es alle korrekten %d im Puffer platzierten, dann laufen lassen, wenn der Benutzer Enter drückt?

+1

Die stdio.h enthalten sollte Corbin

Antwort

4

Weil scanf() Leerraum ignoriert, und Leerraum enthält Zeilenumbrüche. Die scanf() verarbeitet die vier Zahlen jedes Mal auf die gleiche Weise: indem sie Leerraum überspringt, dann eine Kandidatensequenz liest, die wie eine Zahl aussieht (also Zeichen und Ziffern), und das Lesen beim ersten Zeichen stoppt, das nicht sein kann Teil der Kandidatensequenz; Es konvertiert dann die Kandidatensequenz (Verhalten bei Überlauf usw. undefiniert). Wenn Sie ein Leerzeichen nach dem 4 eingeben (und nicht nur einen Zeilenumbruch), warten sowohl das Leerzeichen als auch der Zeilenumbruch darauf, als nächstes gelesen zu werden. Wenn kein Leerzeichen vorhanden ist, wartet der Zeilenumbruch darauf, gelesen zu werden.

Wenn Sie einen nicht-numerischen Zeichen (Satzzeichen oder Buchstaben) eingegeben haben, dann scanf() mit einem Fehler zurückkehren würde (oder weniger als 4 Zahlen umgewandelt — es sei denn, der Brief nach der vierten Zahl ist).

Wenn Sie eine einzelne Zahl eingeben, gefolgt von einer beliebigen Anzahl von Zeilenumbrüchen, geben Sie einfach scanf() Leerzeichen ein, um sie zu überspringen. Es wird nicht aufhören, bis es EOF (Null Bytes gelesen) oder einen Lesefehler (oder einen Konvertierungsfehler, wie ein Buchstabe oder Interpunktionszeichen anstelle einer Ziffer) bekommt.

+0

Vielen Dank für Ihre Zeit. Ignorieren? warum newlines dann scanf auslösen, wenn alle% d eingegeben werden? –

+0

@qwrqwr: das ist nicht scanf, sondern der kernel tty-Treiber, der zeilenorientiert ist (er sendet die Daten nicht an Ihr Programm, bis Sie Enter oder^D drücken) –

1

, die das erwartete Verhalten von Scanf Vom C99-Standard ist:

Eine Umwandlungsspezifikation in den folgenden Schritten ausgeführt wird: - Eingangsleerraumzeichen (wie durch die isspace Funktion angegeben) werden übersprungen, es sei denn, Die Spezifikation enthält einen '[', 'c' oder 'n' Spezifizierer.

es Tokens auf den Trennzeichen (Leerzeichen Tab Newline etc ..) der letzte Newline ist Teil der Tokenisierung .. sonst wie würde es wissen, wenn Ihre Integer endet?: D

Ich denke, das löst Ihre Frage? Ich bin nicht sicher . Hoffe, das hilft

Verwandte Themen