2016-07-29 46 views
-1
int c; 

while ((c = getchar()) != EOF) 
    putchar(c); 

„Dieser Wert wird EOF genannt, für "das Ende der Datei". Wir müssen c erklären eine Art groß sein genug, um EOF zusätzlich zu jedem möglichen Zeichen zu halten. Deshalb verwenden wir int. "Beispiel in Kapitel 1, 1.5.1, von der Programmiersprache C Zweiten edittion K & R,

korrigiert mich wenn ich falsch bin:

  • (signiert) char = [-128. +127]
  • unsigned char = [0, 255]
  • EOF = -1

wenn ich int mit char in dem obigen Programm ersetzen Sie es wie beabsichtigt zu funktionieren scheint, aber nach einigen Recherchen fand ich aus, dass es nicht, weil die Variable c nicht speichern kann -1 aka EOF (wenn auch mit char).

Ich lief es trotzdem und versuchte es zu crashen, versuchte ich negative Zahl wie -1 einzugeben, aber es hat nicht funktioniert. Ich glaube das liegt daran, dass es wie 2 verschiedene Zeichen - und 1 interpretiert wird. Ich versuchte ÿ welches ist das Zeichen entsprechend ASCII-Wert 255 nach http://ascii-code.com/, also für welche Eingabe wird das obige Programm (mit char anstelle von int) Absturz?

(Informationen, ich bin mit einem 64-Bit-Fedora Linux)

+0

Warum denkst du wird es abstürzen? – melpomene

+0

'Korrigieren Sie mich, wenn ich falsch liege:' - Sie liegen falsch. Tauschen Sie die Bereiche "signed" und "unsigned". Und wie Olaf gesagt hat. –

+0

'SCHAR_MIN', die untere Grenze von' signed char', ist typischerweise '-128', nicht' -127'. Das ist für 2'-Komplement-Implementierungen mit 'CHAR_BIT == 8'. Andere Werte sind möglich. Plain 'char' kann entweder signiert oder vorzeichenlos sein; Es hat den gleichen Bereich und die gleiche Darstellung wie "signed char" oder "unsigned char", aber es ist immer noch ein eigener Typ. –

Antwort

3

Es wurde bereits in anderen Antworten erläutert, aber manchmal ist es schwieriger, das Duplikat zu finden, als die Antwort zu geben.

Der einfache Typ char kann signiert oder vorzeichenlos sein.

Die Funktion getchar() gibt entweder EOF oder ... erhält das Zeichen als unsigned char umgewandelt zu einem int ... (unter Angabe der Standard für fgetc(), aber es gilt auch für getchar() auch).

Wenn Sie eine nicht signierte Ebene char Typ haben, dann wird der Auftrag einen Wert 0..255 erzeugen, die dann für den Vergleich mit EOF zu int gefördert werden, und da keiner der Werte 0..255 negativ ist, Der Test wird immer fehlschlagen - und die Schleife wird nicht stoppen, bis Sie das Programm auf andere Weise beenden (Interrupt, Neustart, ...).

Wenn Sie einen einfachen Typ char haben, behandelt die Zuweisung beide gültigen Zeichen (oft - U + 00FF, LATEIN KLEINER BUCHSTABIERER MIT DIAERESE, wenn Sie einen Ein-Byte-Code wie ISO verwenden 8859-15) und EOF als Markierung für EOF, sodass die Schleife bei einigen Dateien vorzeitig beendet werden kann.

So, abhängig von der Maschine, die Schleife:

char c; 

while ((c = getchar()) != EOF) 
    ; 

kann entweder eine unendliche Schleife sein oder es kann vor EOF für einige Datendateien beenden. Weder ist korrektes Verhalten - und kein Verhalten ist ein Absturz. (Der Code in der Frage stürzt nicht ab.) Das Ändern des Typs c zu int behebt beide Probleme zuverlässig und portabel.

Beachten Sie, dass Sie, wenn Sie mit einem UTF-8-Gebietsschema arbeiten, das hex 0xFF-Byte nicht generieren; das ist kein gültiges Byte in UTF-8 (U + 00FF wird als zwei Bytes 0xC3 0xBF in UTF-8 codiert).

+1

Sehr nette Antwort. Ein weiterer Vorteil der Verwendung von 'int c' besteht in der nachfolgenden Verwendung von' is ...() 'Funktionen wie' isspace() ', die einen Wert im selben Bereich von' unsigned char'/'EOF' erwarten. Der Code kann 'issspace (c)' verwenden. Mit 'char c' sollte der Code' isspace ((unsigned char) c) 'verwenden, um UB zu vermeiden. – chux

-1

Der Grund, warum es in C abstürzen kann, dass char nicht zu oder ohne Vorzeichen angegeben ist. Es kann gut auf Ihrer Maschine funktionieren, aber auf anderen kann es scheitern. Und auch getchar() Funktion zurückgeben int Wert, so sollten Sie int Variable verwenden, um diesen Rückgabewert zu erhalten.

+2

Warum würde 'char' signiert oder nicht signiert werden, damit es abstürzt? – melpomene