Wie bekomme ich ein int von stdio in C?

Lesezeit: 4 Minuten

Benutzer-Avatar
maček

Damit habe ich erhebliche Probleme…

printf("> ");
int x = getchar();

printf("got the number: %d", scanf("%d", &x));

Ausgabe

> 1234
got the number: 1

  • 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 erhalten sscanf 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

Benutzer-Avatar
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

  1. Das stdin Datei geschlossen oder beschädigt ist, so dass Sie überhaupt nichts erhalten.
  2. Der Benutzer gibt etwas Ungültiges ein.

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 EOFund 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 scanfwelches 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 scanfnicht 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


Benutzer-Avatar
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).

Benutzer-Avatar
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);

Ausgänge

> [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

1378370cookie-checkWie bekomme ich ein int von stdio in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy