Skip to content
Tiantan
Articles

EOF(ファイルの終わり)文字をchar型に格納する

On 2月 18, 2021 by admin

DennisRitchieの Cプログラミング言語で読みましたintをEOFを保持する変数に使用する必要があることを予約– EOF値を保持できるように十分に大きくする–ではありませんchar。ただし、次のコードは正常に機能します。

#include<stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } } 

ある場合が入力されなくなった場合、getcharはEOFを返します。上記のプログラムでは、char型の変数cがそれを保持できます。

これが機能する理由上記の本の説明によると、コードは機能しないはずです。

コメント

  • EOF文字はありません。
  • 値が0xff。getchar()<の結果を保存するintの/ div>は、その問題を解決します。あなたの質問は、 comp.lang.c FAQ の質問12.1と基本的に同じです。これは優れたリソースです。 (また、main()はint main(void)である必要があり、'を追加しても問題はありません。 return 0;終了前}。)
  • @delnan:リンクされた記事は' Unixがcontrol-Dをどのように扱うかについてはまったく正しくありません。 '入力ストリームを閉じません。コンソールでブロックしているfread()が、未読のデータとともにすぐに戻るだけです。多くのプログラムは、fread()からのゼロバイトの戻り値をEOFを示すものとして解釈しますが、ファイルは実際には開いたままで、より多くの入力を提供できます。
  • 回答

    暗黙の型変換が誤って正しいことを行うため、コードは機能しているようです。

    getchar() intをunsigned charの範囲に収まる値、またはEOF(これは負である必要があり、通常は-1)です。 EOF自体は文字ではなく、使用可能な文字がなくなったことを示す信号であることに注意してください。

    cには、2つの可能性があります。タイプcharのいずれかで値を表すことができます。その場合、それはcの値です。または、タイプchar は値を表すことができません。その場合、何が起こるかは定義されていません。 Intelプロセッサは、新しいタイプに収まらない上位ビットを切り落とすだけです(charの256を法とする値を効果的に減らします)が、それに依存するべきではありません。

    次のステップは、cをEOFと比較することです。EOFはint、cもintに変換され、保存されている値が保持されますc内。cがEOFの値を格納できる場合、比較は成功します。 、ただし、cが値を 保存できなかった場合、を入力してcharと入力します。

    コンパイラがcharを入力することを選択したようです。署名され、EOFの値が小さいcharに収まるのに十分です。 charが署名されていない場合(またはunsigned charを使用した場合)、unsigned charはEOFの値を保持できません。


    また、コードに2番目の問題があることに注意してください。

    は文字自体ではありませんが、強制的にcharタイプにすると、

    可能性のある文字の半分については、正しく処理されるかどうかは定義されていません。

    コメント

    • 強制charの値をCHAR_MIN .. CHAR_MAXの範囲外で入力するには、どちらかを生成する必要があります実装で定義された値、実装がトラップ表現として定義するビットパターンを生成する、または実装で定義された信号を生成します。ほとんどの場合、実装は2つ以外のことを行うために多くの追加作業を行います'-補数の削減。標準委員会の人々が、他の理由がない限り、コンパイラが他のほとんどのコンパイラと一致する動作を実装するように奨励されるべきであるという考えに同意した場合…
    • …私はそのように考えます信頼できるものとしての強制(コードがその意図を文書化するべきではないことは言うまでもありませんが、(signed char)xは、より明確で同じように見なされるべきです。 ((unsigned char)x ^ CHAR_MAX+1))-(CHAR_MAX+1)として安全です。)現状では、'コンパイラが今日に準拠する他の動作を実装する可能性はありません'の標準; 1つの危険は、"最適化"の想定される利益のために動作を中断するように標準が変更される可能性があることです。
    • @supercat:この標準は、対象のプロセッサで自然にサポートされていない動作をするコードをコンパイラが生成する必要がないように記述されています。 (標準の作成時点で)すべてのプロセッサが一貫して動作するわけではないため、未定義の動作のほとんどが存在します。コンパイラが成熟するにつれ、コンパイラの作成者は未定義の動作を利用して、より積極的な最適化を行うようになりました。
    • 歴史的に、標準の意図はほとんどあなたが説明したとおりでしたが、標準はいくつかの動作を説明しています。いくつかの一般的なプラットフォームのコンパイラが、より緩い仕様で必要とされるよりも多くのコードを生成することを要求するのに十分な詳細。 int i=129; signed char c=i;の型強制は、そのような動作の1つです。 cが'の場合、iと等しくなる命令を持つプロセッサは比較的少数です。範囲は-127〜 + 127であり、iの他の値から、2つとは異なる-128〜 +127の範囲の値への一貫したマッピングが生成されます' s-補数の削減、または…
    • …このような場合、一貫してシグナルが発生します。標準では、実装が一貫したマッピングを生成するか、一貫して信号を生成することを要求しているため、標準が2つ以外の何かの余地を残す唯一のプラットフォーム'-補数の削減は飽和算術ハードウェアを備えたDSPのように。未定義の振る舞いの歴史的根拠については、問題はハードウェアプラットフォームだけでは'ではないと思います。オーバーフローが非常に一貫した方法で動作するプラットフォームでも、コンパイラにトラップさせると便利な場合があります…

    Written by admin

    コメントを残す コメントをキャンセル

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    最近の投稿

    • 共振ダイポールを備えたバランの使用
    • “できない”と“できない? [重複]
    • JFKでは国内線のエアサイドターミナル間を移動できますか?
    • “深く感謝します”または“深く感謝します”
    • '抽象的なアイデア'とはどういう意味ですか? [クローズ]

    アーカイブ

    • 2021年2月
    • 2021年1月
    • 2020年12月
    • 2020年11月
    • Deutsch
    • Nederlands
    • Svenska
    • Norsk
    • Dansk
    • Español
    • Français
    • Português
    • Italiano
    • Română
    • Polski
    • Čeština
    • Magyar
    • Suomi
    • 日本語
    • 한국어

    Copyright Tiantan 2021 | Theme by Theme in Progress | Proudly powered by WordPress

    Back to top