Dies ist mein C-Quellcode.
Wenn ich es in Ubuntu baue, werden Zeichen angezeigt, aber ich weiß nicht, wie ich das Programm beenden soll, da es nicht durch Eingabe ENTERoder einen Wagenrücklauf endet .
Was bedeutet EOF? Wie kann ich es auslösen?
Diese Quelle ist auch auf einem Buch von Dennis Ritchie:
#include <stdio.h>
/* count digits, white space, others */
main ()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar ()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf ("digits =");
for (i = 0; i < 10; ++i)
printf (" %d", ndigit[i]);
printf (", white space = %d, other = %d\n", nwhite, nother);
}
command-line
c
Stapelprogrammierer
quelle
quelle
-1
entspricht EOF. Es ist/usr/include/stdio.h
als Makrokonstante definiert-1
als Eingabe funktioniert nicht :)Antworten:
Tl; dr
Sie können EOF im Allgemeinen in einem Programm "auslösen", das in einem Terminal mit einem CTRL+ DTastendruck direkt nach der letzten Eingabespülung ausgeführt wird.
EOF bedeutet Dateiende.
"EOF auslösen" bedeutet in diesem Fall ungefähr "das Programm darauf aufmerksam machen, dass keine Eingabe mehr gesendet wird".
In diesem Fall
getchar()
wird die Ausführung beendet , da eine negative Zahl zurückgegeben wird, wenn kein Zeichen gelesen wird.Dies gilt jedoch nicht nur für Ihr spezifisches Programm, sondern auch für viele verschiedene Tools.
Im Allgemeinen kann das "Auslösen von EOF" mit einem CTRL+ DTastendruck direkt nach dem letzten Eingangs-Flush erfolgen (dh durch Senden eines leeren Eingangs).
Zum Beispiel mit
cat
:Was unter der Haube passiert, wenn CTRL+ gedrückt Dwird, ist, dass die Eingabe, die seit dem letzten Eingabe-Flush eingegeben wurde, geleert wird. wenn dies geschieht , die eine leere eingegeben werden
read()
genannt Syscall auf der STDIN kehrt das Programm0
,getchar()
gibt eine negative Zahl (-1
in dem GNU C - Bibliothek) , und dies ist wiederum als EOF interpretiert 1 .1 - /programming//a/1516177/4316166
quelle
TL; DR : EOF ist kein Zeichen, sondern ein Makro zur Bewertung der negativen Rückgabe einer Eingabe-Lesefunktion. Man kann Ctrl+ verwenden D, um
EOT
Zeichen zu senden , die die Funktionsrückgabe erzwingen-1
Jeder Programmierer muss RTFM
Wir verweisen auf "CA Reference Manual" von Harbison und Steele, 4. Aufl. ab 1995, Seite 317:
Im Wesentlichen
EOF
handelt es sich nicht um ein Zeichen, sondern um einen ganzzahligen Wert , derstdio.h
zur Darstellung implementiert ist-1
. Somit ist die Antwort von kos soweit richtig, aber es geht nicht darum, "leere" Eingaben zu erhalten. Wichtiger Hinweis ist, dass hier EOF als Rückgabewert (desgetchar()
) Vergleichs dient, nicht um ein tatsächliches Zeichen zu kennzeichnen. Dasman getchar
unterstützt das:Betrachten Sie die
while
Schleife - ihr Hauptzweck besteht darin, die Aktion zu wiederholen, wenn die Bedingung in den Klammern erfüllt ist . Schau nochmal:Grundsätzlich heißt es, mach weiter, wenn
c = getchar()
erfolgreicher Code zurückgegeben wird (0
oder höher; es ist übrigens üblich, einen erfolgreichen Befehl auszuführen , dannecho $?
und dann fehlgeschlagenecho $?
und die zurückgegebenen Zahlen zu sehen). Wenn wir also erfolgreich Zeichen erhalten und C zuordnen, ist der zurückgegebene Statuscode 0, fehlgeschlagen -1.EOF
ist definiert als-1
. Wenn ein Zustand-1 == -1
eintritt, werden die Schleifen daher gestoppt. Und wann wird das passieren? Wenn kein Charakter mehr zu bekommen ist, wenn erc = getchar()
fehlschlägt. Sie könnten schreibenwhile ((c = getchar ()) != -1)
und es würde immer noch funktionierenKehren wir auch zum eigentlichen Code zurück. Hier ist ein Auszug aus
stdio.h
ASCII-Codes und EOT
Obwohl das EOF-Zeichen kein tatsächliches Zeichen ist, gibt es ein
EOT
(Ende der Übertragung) Zeichen mit dem ASCII-Dezimalwert 04; Es ist mit der Verknüpfung Ctrl+ verknüpft D(auch als Metazeichen dargestellt^D
). Das Ende der Übertragung wird verwendet, um das Schließen eines Datenstroms vor langer Zeit anzuzeigen, als Computer zur Steuerung von Telefonverbindungen verwendet wurden, daher die Benennung "Ende der Übertragung".Es ist also möglich, diesen ASCII-Wert wie
$'\04'
folgt an das Programm zu senden. Beachten Sie Folgendes: EOT:Wir können also sagen, dass es existiert, aber es ist nicht druckbar
Randnotiz
Wir vergessen oft, dass Computer in der Vergangenheit nicht so vielseitig waren - Designer müssen jede verfügbare Tastaturtaste verwenden. Das Senden eines
EOT
Zeichens mit StrgD bedeutet also immer noch "Senden eines Zeichens", ähnlich wie bei der Eingabe von Großbuchstaben A und ShiftA. Sie geben dem Computer dennoch eine Eingabe mit verfügbaren Schlüsseln. Somit ist EOT ein realer Charakter in dem Sinne, dass es vom Benutzer stammt, vom Computer lesbar ist (obwohl es nicht druckbar ist, für Menschen nicht sichtbar), es existiert im ComputerspeicherKommentar von Byte Commander
Ja, genau richtig, da
/dev/null
darin kein tatsächlich zu lesendes Zeichen vorhanden ist. Daherc = getchar()
wird-1
Code zurückgegeben und das Programm wird sofort beendet. Wieder gibt der Befehl EOF nicht zurück. EOF ist nur eine konstante Variable gleich -1, mit der wir den Rückkehrcode der Funktion getchar vergleichen .EOF
existiert nicht als Zeichen, es ist nur ein statischer Wert im Innerenstdio.h
.Demo:
Ein weiterer Nagel im Sarg
Manchmal wird versucht zu beweisen, dass EOF ein Zeichen mit einem Code wie diesem ist:
Das Problem dabei ist, dass der Datentyp char ein vorzeichenbehafteter oder vorzeichenloser Wert sein kann. Darüber hinaus sind sie der kleinste adressierbare Datentyp, was sie in Mikrocontrollern mit begrenztem Speicher sehr nützlich macht. Anstatt zu deklarieren
int foo = 25;
, ist es üblich, in Mikrocontrollern mit kleinem Speicherchar foo = 25;
oder ähnlichem zu sehen. Außerdem können Zeichen signiert oder nicht signiert sein .Mit einem Programm wie diesem könnte man die Größe in Bytes überprüfen:
Was genau ist der Punkt? Der Punkt ist, dass EOF als -1 definiert ist, der Datentyp char jedoch ganzzahlige Werte drucken kann .
IN ORDNUNG . . Was ist, wenn wir versuchen, char als Zeichenfolge zu drucken?
Offensichtlich ein Fehler, aber dennoch wird uns ein Fehler etwas Interessantes sagen:
Hex-Werte
Das Drucken von EOF als Hex-Wert ergibt
FFFFFFFF
einen 16-Bit-Wert (8 Byte), zwei Komplimente von a-1
.Ausgabe:
Eine andere merkwürdige Sache tritt mit dem folgenden Code auf:
Wenn man Shift+ drückt A, erhält man den Hex-Wert 41, offensichtlich wie in der ASCII-Tabelle. Aber für Ctrl+ Dhaben wir
ffffffff
wieder - den Rückgabewert vongetchar()
gespeichert inc
.Beziehen Sie sich auf andere Sprachen
Beachten Sie, dass andere Sprachen diese Verwirrung vermeiden, da sie einen Funktions-Exit-Status auswerten und nicht mit einem Makro vergleichen. Wie liest man eine Datei in Java?
Wie wäre es mit Python?
quelle
/dev/null
, sollte dies auch einen EOF zurückgeben, oder? Oder was bekomme ich dort?EOF steht für File End . Obwohl ich nicht weiß, wie das folgende Symbol ausgelöst werden soll, können Sie das folgende Programm ausführen, indem Sie eine Datei weiterleiten , die am Ende das EOF- Signal sendet :
Wo
a.out
ist deine kompilierte Quelle?quelle
read()
(syscall) zurückgegeben werden0
, was als EOF interpretiert wird: stackoverflow.com/a/1516177/4316166