Ich frage nur, was macht der getchar in diesem Code und wie funktioniert es? Ich verstehe nicht, warum der getchar den Code beeinflusst, für mich scheint es, als würde er nur den Wert bekommen, aber nichts wird mit dem Wert gemacht.C-Code, scanf und getchar
Antwort
Wahrscheinlich ist der Code zum Lesen in einer Liste von ganzen Zahlen, getrennt durch eine neue Zeile.
scanf liest eine ganze Zahl ein und fügt sie in die Variable c ein.
Die getchar wird im nächsten Zeichen zu lesen (eine neue Zeile unter der Annahme)
Da es nicht überprüfen, gibt es ein gewisses Potenzial, dass es nicht eine neue Linie, oder dass scanf war als das, was es ist fehlgeschlagen versucht zu lesen war keine Nummer.
Einige Möglichkeiten, warum getchar()
dort verwendet worden sein könnte:
1) Wenn es Leerzeichen gemacht wird (in der Regel verwendet, um zu ignorieren, wenn Zeichen mit %c
) abgetastet wird, ist es hier nicht notwendig, weil %d
Whitespaces ohnehin ignoriert.
2) Eine andere Möglichkeit ist, dass nach diese Schleife, einige weitere Prüfung erfolgt, wo die letzte \n
durch den letzten Aufruf von links nach scanf()
könnte ein Problem sein. Also, getchar()
könnte verwendet werden, um es zu ignorieren.
3) Wenn Sie Zeichen eingeben, die nicht mit %d
übereinstimmen, schlägt scanf()
fehl. Da die eingegebenen Zeichen im Eingabestream verbleiben, können Sie nie wieder eine int
lesen (wenn Sie beispielsweise abcdddgdfg
ohne diesen getchar()
-Aufruf eingeben). Also, getchar()
Hier werden alle diese Zeichen (ein pro Iteration) verbrauchen und schließlich können Sie int
(mit %d
) wieder lesen.
Aber das ist alles wirklich nicht nötig; es ist nur ein Versuch, Fehler von scanf()
zu beheben. Lesen von Eingaben mit scanf()
und bekommen es richtig ist wirklich schwierig. Aus diesem Grund wird empfohlen, fgets()
zu verwenden und die Funktionen sscanf()
oder strto*()
zu analysieren, wenn Sie nur Ganzzahlen scannen.
See: Why does everyone say not to use scanf? What should I use instead?
Gute Punkte und Schlussfolgerung. – chux
In diesem Code ist getchar
für seine Nebenwirkungen genannt wird: es ein Zeichen von der Standardeingabe liest und wirft sie weg.
Wahrscheinlich liest dies die Eingabe des Benutzers. scanf
wird eine Nummer konsumieren, aber das Newline-Zeichen nach der Nummer unverändert lassen. Die getchar
verbraucht den Zeilenumbruch und wirft ihn weg. Dies ist in dieser Schleife nicht unbedingt erforderlich, da die nextscanf
Whitespaces überspringt, um die nächste Zahl zu finden, aber es könnte nützlich sein, wenn der Code nach nicht erwartet, dass ein Zeilenumbruch als erstes erwartet wird Ding auf stdin.
Dieser Code ist fehlerhaft, weil es nicht für EOF nicht überprüfen, weil es nicht alles sinnvoll macht, wenn der Eingang nicht eine Zahl oder wenn gibt es mehr Text auf der Linie nach der Zahl, und weil es verwendet scanf
, die wie angegeben zerlegt ist (zum Beispiel ist es erlaubt, crash das Programm, wenn der Eingang überläuft den Bereich von int
). Bessere Code wäre so etwas wie
char *linep = 0;
size_t asize = 0;
char *endp;
long c;
while (getline(&linep, &asize, stdin) > 0) {
errno = 0;
c = strtol(linep, &endp, 10);
if (linep == endp || *endp != '\0' || errno) {
puts("?Redo from start");
continue;
}
if (c == 0) break;
do_something_with(c);
}
free(linep);
getchar();
einfach sein liest und konsumieren die Zeichen nach der Zahl, sei es ein Leerzeichen, Komma, neue Zeile oder den Beginn einer anderen ganzen Zahl oder irgendetwas anderes.
IMO, das ist kein robuster Code. Guter Code würde 1) zumindest das Ergebnis von scanf()
testen und 2) den Verbrauch des folgenden Zeichens testen oder begrenzen, um zu verhindern, dass ein potentielles Zeichen der folgenden Zahl "gefressen" wird. Erinnern Code kann nicht kontrollieren, was ein Benutzer eingibt, sondern muss mit allem umgehen, was eingegeben wird.
v space
"123 456"
v comma
"123,456"
v negative sign
"123-456"
- 1. getc Vs getchar Vs Scanf für
- 2. C: Unterschied im Verhalten von scanf und getchar
- 3. getchar stoppt nicht bei der Verwendung von scanf
- 4. sympy ccode Nummer Typ
- 5. getchar() und Pufferreihenfolge
- 6. Verwirren über getchar() und fflush (stdin) Verhalten
- 7. Putchar und Getchar in C
- 8. Wie verwendet man getchar Funktion und putchar Funktion in C?
- 9. getchar() = EOF
- 10. Wie verwende ich CCode-Attribute in Vala?
- 11. __isoc99_scanf und scanf
- 12. Scanf und zwei Strings
- 13. Wie funktioniert getchar()?
- 14. Verwirrt über getchar() Funktion
- 15. Scanf Charakter in C
- 16. Differenz zwischen scanf ("% c", & c) und scanf ("% c", & c)
- 17. Differenz zwischen Rückgabewerte von scanf ("% s) und scanf (" % [^ \ n] s ")
- 18. Was sind scanf ("% * s") und scanf ("% * d") Formatbezeichner?
- 19. getchar() wird die Konsole nicht geöffnet
- 20. Reimplementierung getContents GetChar mit
- 21. C - char Scanf Probleme
- 22. scanf funktioniert nicht. Müssen Float lesen, behalten und dann lesen
- 23. Unterschied zwischen scanf() und fgets()
- 24. Scanf und Printf in JS
- 25. c Programmierung: (scanf und gets)
- 26. C-Power-Funktion und scanf
- 27. winapi scanf printf und Datentypen
- 28. C - scanf() und dann getenv()
- 29. scanf ohne zusätzliche Argumente in C
- 30. segmentation fault using scanf
Hinweis: Versuchen Sie mit 'char' Typ. Hier ist es überflüssig. –
perfekt danke – james