2010-12-31 12 views
3

(C言語)私はEOFを使用しています.....なぜEOFは-1ですか?なぜ他の価値ですか?なぜC言語でEOF IS -1?

+0

マークバイヤーズ氏の変更された

:= 22

理由の

値答えは正しい。これを行うには、 'getchar'などの出力を常に' char'ではなく 'int'として保存する必要があります。 '(int)-1'は有効な文字ではありませんが、'(char)-1'は有効です。 –

答えて

10

Wikipediaから:

EOFの実際の値はシステム依存である(ただし、一般-1、例えばglibcのように)、任意の有効な文字コードに等しくありません。

これらはほとんどのシステムで文字の有効な値であるため、0〜255の値は使用できません。たとえば、EOFが0の場合、0を読み込んでファイルの終わりに達するまでの違いを知ることはできません。

-1は明らかに残りの選択肢です。

あなたはまた、代わりにfeofを使用して検討する必要があります。

EOFは、ファイルの終わりとランダムエラーの両方を報告するために使用されているので、それはファイルの終わりを明示的にチェックするためにFEOF機能を使用することがしばしばより良いですし、 ferrorエラーをチェックします。

+3

+1「CHAR_BIT」が8の場合、範囲0〜255が適用されます。しかし、 'CHAR_BIT'の値が何であっても、-1は決して有効な値ではありません。 –

+1

@Chris Jester-Young - 0 - 255も 'unsigned char'が標準で保持できる範囲です。 'CHAR_BIT'は8より大きくてもかまいませんが、少なくとも8でなければなりません。 –

+0

@Chris Lutz:そうです。私は、 'CHAR_BIT'が7やそれ以外の16や32の場合を考えていました。 :-) –

4

これはありません。実装定義の負のint定数であると定義されています。 符号なしの文字列から簡単に区別できるように、負でなければなりません。ほとんどの実装では実際に-1ですが、これはC標準では必要ありません。

-1を選択した歴史的な理由は、文字分類関数(< ctype.h>を参照)を単純な配列検索として実装できることでした。そして、それは符号なしのcharに収まらない "最も近い"値です。

[更新:]文字分類関数を効率的にすることは、おそらく最初に-1を選択した主な理由ではありませんでした。私はすべての歴史的な詳細を知らないが、それは最も明白な決定である。 charタイプが正確に8ビットを持たないマシンがあるので、負の値でなければならなかったので、正の値を選ぶのは難しいでしょう。 unsigned charの有効な値ではなく、しかもintに収まるのに十分な大きさでなければなりませんでした。また、負の数を選択する必要がある場合、なぜ大きな負の数をとるべきですか?それは最良の選択として-1を残します。

+0

配列のルックアップ引数についてはわかりませんが、+1にする必要はありません。 –

0
int c; 

c = getchar(); 
while(!feof(stdin) && !ferror(stdin)) { 
    ... 
    c = getchar(); 
} 

で詳細を参照してください。 EOFは空白の前に返された場合に検出された(それは空白文字ではないので)、このループが終了しなくなることがあり

int c; 

c = getchar(); 
while(!isspace(c)) { 
    ... 
    c = getchar(); 
} 

を:次の空白文字までのすべての文字をスキャンすることを意図し、このループは、受信考えてみましょう。より良い方法は、これは次のようになり書き込みます:

int c; 

c = getchar(); 
while(!feof(stdin) && !ferror(stdin) && !isspace(c)) { 
    ... 
    c = getchar(); 
} 

最後に、EOFが通常-1ですが、すべての標準的な約束は、それはint型と負の整数定数であるということであることは注目に値します。

+0

私はsizeof(char)== sizeof(int)== 16ビットのDSPシステムでCを書いた。私は、標準ではデフォルトの 'char'タイプははsizeof(int型)== 1任意のシステム上で、符号なしでなければならないことを義務付けると考えている、とソース・キャラクタ・セットが'に収まらない値を持っているでしょう任意のシステム上で、符号なしである必要があります署名されたchar'。コンパイラは組み込みシステム用であったため、組み込みのgetchar()は存在しませんでした。私はファイルI/Oを追加したいと思ったら、ファイルを8ビットバイトのストリームとして扱い、読み書きメソッドがそれぞれの 'char'に1オクテットを格納するようにすることです。 – supercat

0

EOF値を簡単に変更できます。 Cプログラムでは、デフォルトでは、EOF = -1のマクロを定義します。 プログラムでEOFを記述すると、そのデフォルトのCコンパイラは-1の値を割り当てます。

例えば、

ちょうどあなたがしようとする結果を得る

#include <stdio.h> 
#define EOF 22 
main() 
{ 
    int a; 
    a=EOF; 
    printf(" Value of a=%d\n",a); 
} 

出力:その時間EOFの値は

関連する問題