Damit habe ich erhebliche Probleme…
printf("> ");
int x = getchar();
printf("got the number: %d", scanf("%d", &x));
Ausgabe
> 1234
got the number: 1
maček
Damit habe ich erhebliche Probleme…
printf("> ");
int x = getchar();
printf("got the number: %d", scanf("%d", &x));
> 1234
got the number: 1
Vorlagentypdef
Ich bin mir nicht ganz sicher, ob Sie danach suchen, aber wenn Ihre Frage lautet, wie Sie eine Ganzzahl mit lesen <stdio.h>
dann ist die richtige Syntax
int myInt;
scanf("%d", &myInt);
Sie müssen natürlich viel Fehlerbehandlung durchführen, um sicherzustellen, dass dies korrekt funktioniert, aber dies sollte ein guter Anfang sein. Insbesondere müssen Sie die Fälle behandeln, in denen
stdin
Datei geschlossen oder beschädigt ist, so dass Sie überhaupt nichts erhalten.Um dies zu überprüfen, können Sie den Rückgabecode von erfassen scanf
so was:
int result = scanf("%d", &myInt);
Wenn stdin
beim Lesen auf einen Fehler stößt, result
wird sein EOF
und Sie können auf Fehler wie folgt prüfen:
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
Wenn der Benutzer andererseits etwas Ungültiges eingibt, z. B. eine unbrauchbare Textzeichenfolge, müssen Sie Zeichen auslesen stdin
bis Sie alle anstößigen Eingaben verbraucht haben. Sie können dies wie folgt tun, indem Sie die Tatsache verwenden, dass scanf
gibt 0 zurück, wenn nichts gelesen wurde:
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
if (result == 0) {
while (fgetc(stdin) != '\n') // Read until a newline is found
;
}
Hoffe das hilft!
BEARBEITEN: Als Antwort auf die ausführlichere Frage hier eine passendere Antwort. 🙂
Das Problem mit diesem Code ist, dass beim Schreiben
printf("got the number: %d", scanf("%d", &x));
Dies druckt den Rückkehrcode aus scanf
welches ist EOF
bei einem Stream-Fehler, 0
wenn nichts gelesen wurde, und 1
Andernfalls. Das heißt, insbesondere wenn Sie eine ganze Zahl eingeben, wird diese immer gedruckt 1
weil Sie den Statuscode aus drucken scanf
nicht die Zahl, die Sie lesen.
Um dies zu beheben, ändern Sie dies in
int x;
scanf("%d", &x);
/* ... error checking as above ... */
printf("got the number: %d", x);
Hoffe das hilft!
Es tut mir leid, dass ich bei meiner ursprünglichen Frage keine weiteren Informationen bereitgestellt habe. Ich habe oben Updates gemacht.
– maček
23. Februar 2011 um 4:47 Uhr
@macek- Dies wurde gerade aktualisiert, um näher auf Ihr spezielles Problem einzugehen. Kannst du dir das mal anschauen und schauen ob es hilft?
– Vorlagentypdef
23. Februar 2011 um 4:50 Uhr
Unsere Antworten waren so ähnlich, dass ich einfach beschlossen habe, meine zu löschen. Deins ist viel besser und ausführlicher! Auch nur ein winziger Nitpick, scanf gibt die Anzahl der erfolgreich gelesenen Elemente zurück. Wenn Sie also “%d %d” ausführen, würde es 2 zurückgeben.
– Marlon
23. Februar 2011 um 4:51 Uhr
@templateypedef, danke, danke! Die beigefügte Erklärung ist sehr hilfreich 🙂
– maček
23. Februar 2011 um 4:54 Uhr
Jerry Sarg
Der typische Weg ist mit scanf
:
int input_value;
scanf("%d", &input_value);
In den meisten Fällen möchten Sie jedoch überprüfen, ob Ihr Versuch, Eingaben zu lesen, erfolgreich war. scanf
gibt die Anzahl der erfolgreich konvertierten Elemente zurück, sodass Sie normalerweise den Rückgabewert mit der Anzahl der erwarteten Elemente vergleichen möchten. In diesem Fall erwarten Sie, einen Artikel zu lesen, also:
if (scanf("%d", &input_value) == 1)
// it succeeded
else
// it failed
Das gilt natürlich auch für alle scanf
Familie (sscanf
, fscanf
usw).
Josefmezr
Die Lösung ist ganz einfach … Sie lesen getchar(), was Ihnen das erste Zeichen im Eingabepuffer liefert, und scanf hat es einfach in eine ganze Zahl geparst (weiß wirklich nicht warum), wenn Sie nur das getchar für vergessen In einer Sekunde wird der gesamte Puffer gelesen, bis ein Zeilenumbruchzeichen angezeigt wird.
printf("> ");
int x;
scanf("%d", &x);
printf("got the number: %d", x);
> [prompt expecting input, lets write:] 1234 [Enter]
got the number: 1234
Das funktioniert nicht ganz … es gibt nur den Rückgabecode von scanf () aus, der normalerweise 0 oder 1 ist. Sie wollen: int x; scanf("%d", &x); printf("number: %d", x);
– Charlie
10. Mai 2016 um 21:32 Uhr
Der Grund, warum Sie das bekommen haben
1
ist völlig zufällig.scanf
gibt die Anzahl der erfolgreich gelesenen Werte zurück, weshalb es Ihnen eine 1 anzeigt. Probieren Sie eine andere Zahl aus und Sie werden sehen, warum.– Marlon
23. Februar 2011 um 4:49 Uhr
Siehe stackoverflow.com/questions/4023895/… wenn Sie eine robuste Eingabelösung wünschen. Ich disse die akzeptierte Antwort nicht,
scanf
ist in Ordnung (z Dies Situation sowieso, nicht so für die unbegrenzte Zeichenfolgeneingabe), aber Sie werden irgendwann etwas wollen, das als Allzwecklösung verwendet werden kann. Dann ist es oft besser, eine Zeichenfolge vom Benutzer zu erhaltensscanf
es, andere Darstellungen zu erhalten.– paxdiablo
23. Februar 2011 um 5:07 Uhr
Was macht das getchar() da?
– Jim Balter
23. Februar 2011 um 9:53 Uhr