2016-09-06 27 views
1

今まで私は、EOFでこの関数が-1を返すので、getchar()をintとして使うことを発見しました。私は疑問に思っていたチャイルドは-1を保持する?私もできると思うのは、-128から127までです。なぜC言語のgetchar()関数が整数ですか?

私はグーグルのトップリストから検索しましたが、私が得た答えは私を満足させませんでした。

+2

だから、もし誰かが実際にコードが '-1 'の文字を入力すると、 –

+0

は-1を出力します。私はそれも試みました。getChar()が-1を返したとき、それは-1キーボード! @ M.M –

+2

私はコードが '-1'で、' -'と '1'ではないと言った。 –

答えて

6

まず、ちょうど何かをクリアするために、EOFは、具体的である必要はありません-1。 ISO C標準では、その値に負の値が必要です。

また、charのタイプは符号付きまたは符号なしであることに注意してください。これは実装定義です。

機能fgetc,getcおよびgetcharは、テキストストリームだけでなく、バ​​イナリストリームを処理するために使用できます。バイト数は0〜UCHAR_MAXです。この範囲の自然なタイプはunsigned charです。戻り値getcunsigned charにはなりませんでした。EOFは表現できないためです。 signed charは0からUCHAR_MAXまでの値を保持できないため、いずれもsigned charにはなりませんでした。したがって、より広いタイプが選択されます:タイプint。主流のプラットフォームでは、intcharよりも広く、少なくとも2のサイズを持っています。したがって、EOFに使用できる負の値と、0〜UCHAR_MAXの範囲のすべてのバイト値を表すことができます。

いくつかのC実装(DSPチップなどのシステム用)では、これは正しくありません。intは1バイト幅です。これは課題を表しています。このようなCの実装では、getcによって返される有効なバイト値の範囲は負でなければならず、これらの値の1つはEOFと衝突します。慎重に記述されたコードでは、これが当てはまることが分かります。EOFに等しい値が返されましたが、feofおよびferror関数はfalseを返します。ストリームにエラーがなく、ファイルの終わりが発生していません。したがって、EOFのような値は、実際には有効なバイトです。

+1

EOF <0の説明に感謝します。必ずしもEOF = -1でなくてもかまいません。 –

4

getchar()ファミリは、EOF -1(char)-1または(unsigned char)255と区別できるように整数を返します。

+0

私はちょっと混乱しています。私は-1の検索を試みましたが、見つけられませんでしたか?私はテーブルの正の数を見ます!@ J Earls –

+0

「テーブル」とは、米国のASCIIチャートなどを意味する場合は、すべて正の数になります。しかし、C 'char'型は8ビット** signed **整数型です。 0〜127、128〜255ではなく、-128〜-1の数字を表します。 –

0

Asciiエンコーディングを使用するチャースは、符号なし8ビット整数であるバイトを使用して格納されます。したがって、charsは0〜255の数値を取ることができます。

ファイルの終わり(EOF)のためのマジックナンバーである、-1を可能にするために署名したintを返しGETCHAR

関連する問題