verwirrt über getchar und scanf
Ich bin wirklich verwirrt über die Verwendung von getchar()
und scanf()
. Was ist der Unterschied zwischen diesen beiden?
Ich weiß, dass scanf()
[und Familie] Holen Sie sich ein Zeichen durch Zeichen aus der Benutzer [oder file] und speichern es in eine variable, aber tut es das sofort oder nach drücken etwas (Enter
)?
ist und ich nicht wirklich verstehen, diesen code habe ich gesehen, dass viele Teile des Codes mit getchar()
- und Sie alle lassen Sie Sie geben, was Sie wollen auf dem Bildschirm und keine Reaktion passieren, aber wenn Sie drücken Sie enter
es beendet.
int j, ch;
printf("please enter a number : \n");
while (scanf("%i", &j) != 1) {
while((ch = getchar()) != '\n') ;
printf("enter an integer: ");
}
Hier in diesem code kann ich nicht verwenden scanf()
zu bekommen, ein Zeichen von Charakter und es testen? Auch nicht, was diese Zeile bedeuten?
scanf("%i", &j) != 1
da, wenn ich gedrückt 1 es unterscheidet sich nicht, wenn ich gedrückt 2? was hat es mit diesem Stück zu tun?
und wenn diese Zeile wird passieren?
printf("enter an integer: ");
weil es nie passiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut,
scanf
ist ein vielseitiges Dienstprogramm, das die Funktion, welche Lesen können viele Arten von Daten, basierend auf den format-string, währendgetchar()
liest nur ein Zeichen.Grundsätzlich
entspricht
Ich bin mir nicht 100% sicher, aber wenn Sie nur Lesen müssen, ein Zeichen, das
getchar()
könnte 'billiger' alsscanf()
, als der Aufwand der Bearbeitung der format-string nicht vorhanden ist (diese zählen konnte, zu etwas, wenn Sie Lesen, viele Zeichen, wie in einem riesigen for-Schleife).Für die zweite Frage.
Diesem code:
heißt, Sie wollen
scanf
zu Lesen, die eine ganze Zahl in die variable 'j'. Wenn Lesen erfolgreich, das heißt, die nächste Eingabe in den stream eigentlich ist integerscanf
1 zurück, als es richtig gelesen und zugewiesen 1 integer.Sehen, die älteste Antwort auf diese Frage ALSO für mehr details auf
scanf
Werte zurückgeben.int
nichtchar
. Wie sollten wir sonst bekannt, wenn EOF gefunden wird.char c = getchar();
nicht zur Förderung einer guten Stil, meiner Meinung nach.Ist hier, wie dieser code bricht.
scanf()
verbraucht einzelne Zeichen aus dem Eingabe-stream, bis Sie sieht ein Zeichen, das nicht nicht match der%i
umwandlungsspezifikator1, und das nicht passende Zeichen im input-stream;scanf()
versucht konvertieren die Eingabe von text in einen Wert des entsprechenden Typs; d.h., wenn Sie den Text eingeben"1234\n"
, wird Sie konvertiert den integer-Wert1234
wird der umgewandelte Wert wird der Variablen zugewiesenj
, und die'\n'
werden Links in der input-stream;"abcd"
), dann wird keine Konvertierung ausgeführt, und nichts ist zugeordnetj
;scanf()
gibt die Anzahl der erfolgreichen Umwandlungen und Aufgaben.scanf()
Anruf nicht1
, dann kann der Benutzer nicht geben Sie eine gültige Ganzzahl string;scanf()
aufrufen, so verwenden wirgetchar()
zu konsumieren Zeichen, bis wir sehen, ein Zeilenumbruch, an welchem Punkt wir der Benutzer aufgefordert, um erneut zu versuchen, und führen Sie diescanf()
wieder anrufen.1 ist. Die
%i
umwandlungsspezifikator überspringt Sie alle führenden whitespace-Zeichen und akzeptiert Optional vorzeichenbehaftete integer-Konstanten in oktal -, dezimal-oder hexadezimal-Formate. So wird es akzeptieren strings der form[+|-]{0x[0-9a-fA-F]+ | 0[0-7]+ | [1-9][0-9]*}
Den
scanf
Scannen können beliebig formatierte Daten und analysieren Sie es als mehrere Typen (Ganzzahlen, Fließkomma, strings, etc.). Diegetchar
Funktion wird nur ein einzelnes Zeichen und gibt es zurück.Den Ausdruck
liest eine (möglicherweise signed) integer aus der Standardeingabe und speichert es in der variable
j
. Danach wird der Rückgabewert derscanf
- Funktion (gibt die Anzahl der erfolgreich gescannten Umbauten) und vergleicht es mit1
. Das bedeutet, dass der Ausdruck "wahr", wennscanf
nicht gelesen oder konvertiert einen integer-Wert. Damit die Schleife wiederholt wird, solangescanf
ausfällt.Möchten Sie vielleicht zu prüfen,das
scanf
- Referenz.Dass die
printf
nicht passiert sein könnte, entweder, weil es nie passiert (einen debugger verwenden, um das herauszufinden), oder es einfach scheinbar nicht passieren, aber das tut es wirklich, denn der Ausgang muss geleert werden. Spülung die Ausgabe erfolgt entweder durch das drucken von einem Zeilenumbruch, oder mit derfflush
Funktion:1
weil es gescannt und konvertiert ein Element. Wenn Sie in einer Zeichenfolge, die es konnte nicht konvertiert es in eine Ganzzahl, und so kehrte0
wie es gescannt und umgewandelt null Einträge.scanf
liest text (eine Folge von Zeichen) und konvertiert, abhängig von der format-code, den Sie geben. Mit dem format"%i"
Sie Fragenscanf
text zu Lesen und konvertiert es in eine Ganzzahl.Soweit ich das verstanden habe,
die Funktion getchar liest Ihre Eingabe einer Charakter zu einer Zeit.
scanf liest alle Arten von Daten, und wird mehr nützlich zum definieren einer data-Gruppe.
Jedoch, so weit als strings gehen, mein Lehrer empfiehlt, bekommt anstelle von scanf. Dies ist, weil scanf wird halt "immer" die Daten, die bei den ersten weißen Raum, den Sie setzen, wie in einem Satz...
Soweit ich weiß,
scanf
liest Benutzereingabe, bis das erste Leerzeichen, unter Berücksichtigung der input-format angegeben.getchar
jedoch, liest nur ein einzelnes Zeichen.scanf
zurück, die Zahl der Argumente der format-Liste wurden erfolgreich gelesen, so erklärt hier. Sie erhalten das gleiche Ergebnis, wenn durch drücken von 1 oder 2, da beide von Ihnen erfolgreich Lesen der%i
Formatbezeichner.getchar liest ein char in einer Zeit, von der Eingabe. wo, wie scanf mehr Lesen kann, je nach Datentyp u angeben.
es nicht gut ist, die Praxis zu verwenden scanf() versuchen Sie mit Hilfe der Funktion fgets(), die viel effizienter und sicherer als scanf.
sscanf
danach.scanf("%a")
ist in der Regel besser alsfgets
aber es ist als nicht-standardgetline()
dass ich es nennen würde, am besten.gets()
undfgets()
und reparierte meinen Kommentar, bevor ich sah Ihren Kommentar.