(C言語)私はEOFを使用しています.....なぜEOFは-1ですか?なぜ他の価値ですか?なぜC言語でEOF IS -1?
答えて
Wikipediaから:
EOFの実際の値はシステム依存である(ただし、一般-1、例えばglibcのように)、任意の有効な文字コードに等しくありません。
これらはほとんどのシステムで文字の有効な値であるため、0〜255の値は使用できません。たとえば、EOFが0の場合、0を読み込んでファイルの終わりに達するまでの違いを知ることはできません。
-1は明らかに残りの選択肢です。
あなたはまた、代わりにfeof
を使用して検討する必要があります。
EOFは、ファイルの終わりとランダムエラーの両方を報告するために使用されているので、それはファイルの終わりを明示的にチェックするためにFEOF機能を使用することがしばしばより良いですし、 ferrorエラーをチェックします。
+1「CHAR_BIT」が8の場合、範囲0〜255が適用されます。しかし、 'CHAR_BIT'の値が何であっても、-1は決して有効な値ではありません。 –
@Chris Jester-Young - 0 - 255も 'unsigned char'が標準で保持できる範囲です。 'CHAR_BIT'は8より大きくてもかまいませんが、少なくとも8でなければなりません。 –
@Chris Lutz:そうです。私は、 'CHAR_BIT'が7やそれ以外の16や32の場合を考えていました。 :-) –
これはありません。実装定義の負のint定数であると定義されています。 符号なしの文字列から簡単に区別できるように、負でなければなりません。ほとんどの実装では実際に-1ですが、これはC標準では必要ありません。
-1を選択した歴史的な理由は、文字分類関数(< ctype.h>を参照)を単純な配列検索として実装できることでした。そして、それは符号なしのcharに収まらない "最も近い"値です。
[更新:]文字分類関数を効率的にすることは、おそらく最初に-1を選択した主な理由ではありませんでした。私はすべての歴史的な詳細を知らないが、それは最も明白な決定である。 char
タイプが正確に8ビットを持たないマシンがあるので、負の値でなければならなかったので、正の値を選ぶのは難しいでしょう。 unsigned char
の有効な値ではなく、しかもintに収まるのに十分な大きさでなければなりませんでした。また、負の数を選択する必要がある場合、なぜ大きな負の数をとるべきですか?それは最良の選択として-1を残します。
配列のルックアップ引数についてはわかりませんが、+1にする必要はありません。 –
は、あなたがこれらの値に行ったすべてのテスト上のファイルやエラーの終了の影響を考慮するように注意する必要がありますhttp://en.wikipedia.org/wiki/Getchar#EOF_pitfallとhttp://en.wikipedia.org/wiki/End-of-file
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型と負の整数定数であるということであることは注目に値します。
私はsizeof(char)== sizeof(int)== 16ビットのDSPシステムでCを書いた。私は、標準ではデフォルトの 'char'タイプははsizeof(int型)== 1任意のシステム上で、符号なしでなければならないことを義務付けると考えている、とソース・キャラクタ・セットが'に収まらない値を持っているでしょう任意のシステム上で、符号なしである必要があります署名されたchar'。コンパイラは組み込みシステム用であったため、組み込みのgetchar()は存在しませんでした。私はファイルI/Oを追加したいと思ったら、ファイルを8ビットバイトのストリームとして扱い、読み書きメソッドがそれぞれの 'char'に1オクテットを格納するようにすることです。 – supercat
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の値は
- 1. Windows 10のシステムでC言語のgetchar()からEOFを読み取る
- 2. なぜC言語でint limitをバイパスできますか
- 3. C言語のEOFまでのファイルから数値を読み取る方法
- 4. なぜC言語のgetchar()関数が整数ですか?
- 5. なぜプログラミング言語が
- 6. 言語C、セグメンテーションエラー
- 7. C++ではなくC言語のオブジェクトファクトリ
- 8. なぜstd :: variantはC言語でstd :: variant <int、const int>
- 9. C++:C言語リンケージ
- 10. C++のような言語
- 11. C言語、」、
- 12. 言語C - QuickSort
- 13. C言語ビットトリック
- 14. C言語:リンクリスト
- 15. 高水準のプログラミング言語がC言語ほど速くないのはなぜですか?
- 16. Node.jsがC/C++プログラミング言語で書かれたのはなぜですか?
- 17. (C言語)
- 18. SQL言語でIS NULLを使用するのはなぜですか= NULLではなくIS NOT NULLであるかNULLではありませんか?
- 19. バブルソートがC言語で動作しないのはなぜですか?
- 20. ユニバーサルアレイを客観的なC言語で
- 21. C言語ポインタ
- 22. C言語ポート
- 23. C言語エラー
- 24. C言語で有効なjsonチェック
- 25. なぜ、以下の言語がcfl
- 26. C#IS文が機能しないのはなぜですか?
- 27. C言語のスレッド(linux)
- 28. RPN電卓(C言語)
- 29. エラーメッセージC言語での変数宣言
- 30. デバッグC/C++言語は、ブレークポイント
マークバイヤーズ氏の変更された
:= 22
理由の
値答えは正しい。これを行うには、 'getchar'などの出力を常に' char'ではなく 'int'として保存する必要があります。 '(int)-1'は有効な文字ではありませんが、'(char)-1'は有効です。 –