getchar () und putchar ()
-
25-09-2019 - |
Frage
im Beispiel:
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
Ich verstehe nicht ganz. putchar () würde den Charakter heraus gestellt, aber warum ist es, dass nach EOF es alle Zeichen löscht, und wo es all diese Zeichen erinnern? Danke.
Lösung
Es heißt Pufferung und es wird durch das Betriebssystem. Normalerweise tut es Zeile Pufferung, wo es speichert nur jedes Zeichen, das Sie es in Speicher abgelegt, und dann schreibt sie alle in die Datei, wenn es einen Zeilenumbruch trifft. Das spart Ressourcen, da Dateioperationen als andere Operationen viel mehr Zeit in Anspruch nehmen. Anstatt also Ausgang tut mit jedem einzelnen Zeichen, wartet es für eine Reihe von Zeichen im Puffer zu sammeln und schreibt sie aus alle in einem Rutsch.
Es ist nur ein kluges Manöver der OS getan, dass Sie, der Programmierer, brauchen nicht zu befürchten. werfen Sie Ihre Zeichen nur an sie eins nach dem anderen und lassen den Rest das OS Griff auf seine eigene Weise.
Andere Tipps
[ Dies ist keine Antwort, aber man kann nicht Code in den Kommentaren stellen ]
Ich glaube, Sie so etwas wie dies gemeint:
#include <stdio.h>
main()
{
long nc;
nc = 0;
char c;
while ((c = getchar()) != EOF)
{
putchar(c); /* prints one char */
++nc;
}
printf("%ld\n", nc); /* prints the number of characters read */
}
Nein, wo dieser Code nur leeren Sie den Eingang und schreiben, wie viele Zeichen vor dem Flush gelassen wurden.
Dies ist sicher sein, dass das keine Zeichen in der Eingabedatei verbleibenden (stdin)
Lassen Sie uns Bewertung der Code:
#include <stdio.h>
So weit, so gut ...
main()
{
- Die
main()
Funktion immer zurückkehrt einint
. Immer. - Deklarieren von Funktionen ohne Rückkehr
Typ ist schlechte Form, wie es standardmäßig
int
, aber die Leute mich nicht erinnern, dies einfach beim Lesen Code.
Bewegen Sie sich auf ...
long nc;
nc = 0;
Die gute Form. Die Variable initialisiert wird, bevor es verwendet wird.
while (getchar() != EOF)
++nc;
Dies ist ein wenig komplexer. Aber ein Schritt nach dem anderen.
- Die
getchar
Funktion liefert einint
von der Standardeingabe. - wird dieser Wert dann im Vergleich zu
EOF
. - Wenn der
int
Wert von Standard Eingabe nichtEOF
wird, wird die Variablenc
erhöht.
So die while
Schleife zu verlassen, muss ein EOF von der Standardeingabe erzeugt werden.
Hinweis: Keiner der Werte aus der Standardeingabe gelesen werden gespeichert . Jeder Wert wird verworfen, nachdem der Ausdruck ausgewertet wird.
Style : Ich schlage vor, mit '{' und '}' nach jeder while
Aussage. Dies ist ein sicher Gewohnheit, in.
printf("%ld\n", nc);
Die obige Aussage druckt (Anzeige), um den Wert in nc
. Der Wert in nc
stellt die Anzahl der Zeichen von der Standardeingabe lesen. Diese Aussage hat nicht angezeigt werden alle Zeichen von der Standardeingabe.
}
Schließlich ist das main
Programm muss einen Wert an das Betriebssystem zurück. Zwei tragbare Werte sind EXIT_SUCCESS
und EXIT_FAILURE
, die in stdlib.h
definiert sind. Die Angabe einer dieser Werte wäre auch eine gute Gewohnheit sein.
BTW, gibt es keinen putchar
im Beispiel Sie geschrieben (was ich in diese Antwort kopiert).
putchar die Zeichen in die Puffer setzen, wenn es darum geht, eine eingeben, dann wird es die Zeile Wort Ausgabe auf den Bildschirm bringen.