Ich versuche zu verstehen, getchar ()! = EOF
Bin ich beim Lesen Der Programmiersprache C und haben alles soweit verstanden.
Allerdings, wenn ich kam über die getchar()
und putchar()
ich konnte nicht verstehen, was Ihre Verwendung, und insbesondere, was der folgende code macht.
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
Verstehe ich die main()
Funktion, die Deklaration der integer - c
und die while
Schleife. Aber ich bin verwirrt über den Zustand im inneren des while
Schleife. Was ist der Eingang in diesen C-code und was ist die Ausgabe.
Sorry, wenn dies ist eine einfache und blöde Frage, aber ich bin gerade auf der Suche nach eine einfache Erklärung, bevor ich weiter in dem Buch und werde immer mehr verwirrt.
Kommentar zu dem Problem
Es nur gibt zurück, was Sie geben in das terminal. Bis Sie auf die end-of-input code des Steuerelements. Strg+Z auf Windows, Strg+D auf *nix.
InformationsquelleAutor der Frage Paolo Bernasconi | 2012-05-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser code geschrieben werden können, deutlicher als:
Den
EOF
Zeichen empfangen wird, wenn es keine mehr input. Der name macht mehr Sinn in dem Fall, in dem die Eingabe gelesen wird, aus einer tatsächlichen Datei, sondern als Benutzer-Eingabe (das ist ein Spezialfall einer Datei).[Nebenbei bemerkt, in der Regel der
main
Funktion sollte so geschrieben werden, alsint main(void)
.]InformationsquelleAutor der Antwort Oliver Charlesworth
getchar()
ist eine Funktion, die liest ein Zeichen aus standard-Eingabe.EOF
ist ein spezielles Zeichen im C zu behaupten, dass die ENDE DER DATEI erreicht wurde.In der Regel erhalten Sie eine
EOF
Zeichen der Rückkehr vongetchar()
wenn Ihre standard-Eingabe ist eine andere als die Konsole (D. H., eine Datei).Wenn Sie Ihr Programm in unix wie diese:
Dann Ihre
getchar()
zurückkehren wird jedes einzelne Zeichen insomefile
undEOF
sobaldsomefile
endet.Wenn Sie Ihr Programm wie diesem:
Und senden eine
EOF
über die Konsole (durch drückenCTRL+D
in Unix oder STRG+Z in Windows), danngetchar()
auch zurückEOF
und die Ausführung wird beendet.InformationsquelleAutor der Antwort Pablo Santa Cruz
Vielleicht hast du verwirrt durch die Tatsache, dass die Eingabe von -1 auf den Befehl line noch nicht zu Ende, Ihr Programm? Da
getchar()
liest dies als zwei chars, und 1. In der Zuordnung zu c, der Zeichen umgewandelt, um den numerischen ASCII-Wert. Dieser numerische Wert wird gespeichert in einem Speicher Speicherort, auf die Sie zugreifen, die von c.Dann
putchar(c)
ruft diesen Wert, sucht die ASCII-Tabelle und konvertiert Sie zurück zu Zeichen, die gedruckt wird.Ich denke, finden Sie den Wert -1, Dezimalwert in der ASCII-Tabelle ist unmöglich, da die Tabelle bei 0 beginnt. So
getchar()
hat, um für die verschiedenen Lösungen auf verschiedenen Plattformen. gibt es vielleicht einegetchar()
version für jede Plattform?Ich finde es einfach seltsam, dass das EOF-Zeichen nicht in der regulären ascii. Es hätte eines der ersten Zeichen, die nicht druckbar. Zum Beispiel, am Ende der Zeile in der ASCII.
Was passiert, wenn Sie die übertragung Ihrer Datei von windows auf linux? Wird das EOF-Zeichen automatisch aktualisiert werden?
InformationsquelleAutor der Antwort Pedro Norwego
Den code geschrieben, mit den aktuellen C-standards sollte
Die Schleife könnte umgeschrieben werden
das liest sich wie
c
c
in standard-AusgabeViele Programmiersprachen behandeln außergewöhnlichen Bedingungen durch auslösen von Ausnahmen , brechen Sie den normalen Programmablauf. C gibt keine solche Sache. Stattdessen Funktionen, die fehlschlagen können, haben einen Rückgabewert und alle außergewöhnlichen Umstände sind, signalisiert durch einen speziellen Rückgabewert, die Sie brauchen, um zu überprüfen, aus den Unterlagen, die von der gegebenen Funktion. Im Falle von
getchar
die Dokumentation aus der C11-standard sagt (C11 7.21.7.6p3):Heißt es anderswo, dass
EOF
eine integer-Konstante, < 0, und bei jedem ordentlichen return Wert >= 0 - dieunsigned char
null-erweitert, um eineint
.Den stream am Ende der Datei bedeutet, dass alle input verbraucht wurde. Für die standard-Eingabe ist es möglich, dass diese von der Tastatur durch Eingabe von Strg+D auf Unix - /Linux-terminals und Strg+Z in Windows-console windows. Eine andere Möglichkeit wäre es, für das Programm zu erhalten, das input aus einer Datei oder einer pipe anstatt von der Tastatur - dann ist Ende-der-Datei würde signalisiert werden, wenn die Eingaben waren vollständig verbraucht wird, d.h.
oder
Als die oben genannten fragment, das sagt, es gibt tatsächlich zwei verschiedene Bedingungen, die verursachen können
getchar
zurückEOF
: entweder die end-of-file erreicht wurde, oder einen tatsächlichen Fehler aufgetreten. Dies kann nicht abgeleitet werden, die aus dem return-Wert allein. Stattdessen müssen Sie die Funktionen verwenden, diefeof
undferror
.feof(stdin)
würde return-Wert true, wenn das Ende der Datei erreicht wurde, auf die standard-Eingabe.ferror(stdin)
würde true zurückgeben, wenn ein Fehler aufgetreten ist.Ob tatsächlich ein Fehler aufgetreten ist, wird die variable
errno
definiert durch<errno.h>
enthält den Fehlercode; die Funktionperror
können verwendet werden, um automatisch anzuzeigen, eine lesbare Fehlermeldung mit einem Präfix. So konnten wir erweitern das Beispiel umZum auslösen des end-of-file würde man mit Strg+D (hier dargestellt als
^D
) auf eine neue Zeile unter Linux:(beachten Sie, wie die Eingang hier ist line-gepuffert, so dass die Eingabe nicht-interleaved-in der Zeile mit Ausgang).
Ebenso können wir den gleichen Effekt durch die Verwendung eines pipeline.
Auslösen ein Fehler ist ein wenig komplizierter. In
bash
undzsh
Schalen der standard-Eingabe werden kann geschlossen, so dass es nicht von überall her kommen, durch Anhängen<&-
auf der Kommandozeile:Bad file descriptor, oder
EBADF
bedeutet, dass die standard-Eingabe - Datei-Deskriptor-Nummer 0 ungültig war, so wurde es nicht geöffnet.Andere unterhaltsame Art und Weise zu erzeugen, würde ein Fehler sein, Lesen Sie den standard-input von einer Verzeichnis - dies bewirkt, dass errno gesetzt werden, um
EISDIR
auf Linux:Eigentlich den Rückgabewert von
putchar
sollte überprüft werden, zu - den es ebenfallszurück
EOF
auf Fehler, oder das Zeichen geschrieben:Und jetzt können wir testen dies durch Umleitung der standard-Ausgabe zu
/dev/full
- aber es ist ein gotcha - seit der standard-Ausgang ist gepuffert, müssen wir schreiben genug zu bewirken, dass die Puffer zu Spülen sofort und nicht am Ende des Programms. Wir bekommen unendlich null-bytes/dev/zero
:P. S. es ist sehr wichtig, immer verwenden Sie eine variable vom Typ
int
zu speichern den Rückgabewert vongetchar()
. Obwohl, es liest sich ein Charakter, mitunterzeichnet
/unsigned
/plainchar
ist immer falsch.InformationsquelleAutor der Antwort Antti Haapala
getchar() - Funktion liest ein Zeichen von der Tastatur (dh
stdin
)In der Bedingung innerhalb der angegebenen
while
Schleifegetchar()
genannt wird vor jeder iteration und den empfangenen Wert zugeordnet ist, der integerc
.Nun, es muss verstanden werden, dass in C, die standard-Eingabe (
stdin
) ist wie eine Datei. dh, die Eingabe ist gepuffert. Eingabe bleiben in den Puffer, bis er tatsächlich verbraucht.stdin
ist eigentlich die standard-input-stream.getchar()
gibt den nächsten verfügbaren Wert im Eingabepuffer.Das Programm zeigt im wesentlichen, was zum Lesen von der Tastatur; inklusive Leerzeichen wie
\n
(Zeilenumbruch), Leerzeichen, etc.dh die Eingabe ist die Eingabe, die der Benutzer über die Tastatur (
stdin
bedeutet in der Regel die Tastatur).Und der output ist das, was wir Ihnen als input.
Eingaben, die wir bieten, ist ein Lesen von Zeichen & behandelt, als Zeichen, auch wenn wir Ihnen zahlen.
getchar()
zurückEOF
nur, wenn das Ende der Datei erreicht ist. Die 'Datei', wir befassen uns hier mit derstdin
selbst (standard-Eingabe).Vorstellen, eine vorhandene Datei, wo die Eingabe, dass wir Sie über die Tastatur gespeichert wird. Das ist
stdin
.Diese 'Datei' ist wie ein unendlich Datei. Also keine
EOF
.Wenn wir mehr input als die
getchar()
verarbeiten kann (bevor er es als Eingabe durch drücken der Taste enter), werden die zusätzlichen Werte werden gespeichert in der Eingabepuffer nicht verbrauchten.Die
getchar()
liest das erste Zeichen aus der Eingabe, speichern Sie es inc and print
cwith
putchar(c)`.Während der nächsten iteration des
while
Schleife, die zusätzlichen Zeichen, die Sie während der vorherigen iteration, die noch instdin
genommen werden, währendwhile ((c = getchar()) != EOF)
mit derc=getchar()
Teil.Jetzt wird der gleiche Prozess wiederholt, bis sich nichts mehr in den input-buffer.
Dieser lässt es so Aussehen, als wenn
putchar()
ist wieder ein string statt ein einzelnes Zeichen in einer Zeit, wenn mehr als ein Zeichen gegeben ist, die als Eingabe während einer iteration.ZB: wenn Eingang"
abcdefghijkl
der Ausgang gewesen wäre, habe die gleichen
abcdefghijkl
Wenn Sie nicht möchten, dass dieses Verhalten, können Sie hinzufügen fflush(stdin); direkt nach der
putchar(c);
.Dadurch wird die Schleife zu drucken, wird nur das erste Zeichen in der Eingabe während jeder iteration.
ZB: wenn Eingang"
adgbad
nur
a
gedruckt werden.Dem Eingang gesendet wird, um
stdin
nur, nachdem Sie die EINGABETASTE.putchar() ist das Gegenteil von
getchar()
. Es schreibt die Ausgabe auf die standard-Ausgabe-stream (stdout
, in der Regel den Bildschirm).
ist nicht ein Zeichen in der Datei vorhanden. Es ist etwas, das von der Funktion zurückgegeben wird als ein Fehler-code.EOF
Werden Sie wahrscheinlich nicht in der Lage, um zu beenden aus dem geben
while
Schleife der Regel obwohl. Der Eingabe-Puffer wird geleert (für die Anzeige für die Ausgabe), sobald etwas kommt in via Tastatur und diestdin
nicht gebenEOF
.Zum manuellen beenden der Schleife
EOF
gesendet werden können mit der Tastatur durch drückenStrg+D in Linux
Strg+Z in Windows
zB:
Wenn Sie drücken Sie die Tastenkombination zu geben
EOF
die NachrichtGot past!
wird angezeigt, bevor das Programm verlassen.Wenn
stdin
ist nicht bereits leer ist, müssen Sie drücken Sie diese Tastenkombination zweimal. Einmal zum löschen des Puffers und dann zu simuateEOF
.EDIT: Das zusätzliche paar Klammern um
c = getchar()
imwhile ((c = getchar()) != EOF)
ist, um sicherzustellen, dass der zurückgegebene Wert vongetchar()
ist erstmals zugewiesenc
vor , der Wert ist im Vergleich mitEOF
.Wenn diese zusätzlichen Klammern nicht da waren, der Ausdruck wäre effektiv gewesen
while (c = (getchar() != EOF) )
die haben gemeint, dassc
hätte entweder 2 Werte:1
(für true) oder0
(für false) und das ist offensichtlich nicht das, was vorgesehen ist.InformationsquelleAutor der Antwort J...S
In einer ähnlichen Weise zu der | pipe-Befehl oben können Sie die Umleitung auf Ihrem system zu nutzen, um die oben genannten code, um die Anzeige aller Zeichen Inhalt einer Datei, bis es das Ende erreicht (EOF), vertreten durch CTRL-Z oder CTRL-D in der Regel.
In der Konsole:
ProgramName < FileName1.txt
Und zum erstellen einer Kopie von dem, was gelesen wird aus Datei1 können Sie:
ProgramName < FileName1.txt > CopyOfInput.txt
Dies zeigt Sie Ihr Programm in mehrere Möglichkeiten, um hoffentlich Hilfe für Ihr Verständnis.
-Hoffe, das hilft.
InformationsquelleAutor der Antwort Finding Nemo 2 is happening.
Eigentlich c=getchar() liefert das Zeichen, welches der Benutzer eingibt auf der Konsole, und dieser Wert ist geprüft mit EOF die stellt Ende Der Datei . EOF angetroffen wird, bei der letzten Datei. (c = getchar()) != EOF ist äquivalent zu c != EOF . Nun ich denke, das ist viel einfacher . Wenn Sie eine weitere Abfrage, lass es mich wissen.
InformationsquelleAutor der Antwort Shivam Goel
wird ein Zeichen von der Eingabe.
Den Wert dieser Zuweisung ist der Wert der linken Seite nach der Zuweisung oder der Wert der Zeichen, die gelesen wurden. Wert
EOF
ist standardmäßig-1
.Solange der Wert bleibt etwas anderes als
EOF
oder, in anderen Worten, solange die Bedingung bleibt wahr, wird die Schleife weiter Durchlaufen. Sobald der Wert wirdEOF
den Wert der gesamten Bedingung0
und es bricht die Schleife ab.Die zusätzlichen Klammern um
c = getchar()
sind für den compiler, um zu betonen, dass wir wirklich tun wollten, eine Zuweisung in der Bedingung, da es in der Regel davon ausgegangen, dass Sie wollte, geben==
und warnt Sie.Also der gesamte code tatsächlich Echos zurück, was Sie eingeben. Es weist den Wert der Figuren
c
in der Bedingung und dann gibt es wieder in den Körper der Schleife, die endet erst, wenn das Ende der Datei erkannt wird.InformationsquelleAutor der Antwort Darinka Zobenica