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
がそれを保持できます。
これが機能する理由上記の本の説明によると、コードは機能しないはずです。
コメント
0xff
。getchar()
<の結果を保存するint
の/ div>は、その問題を解決します。あなたの質問は、 comp.lang.c FAQ の質問12.1と基本的に同じです。これは優れたリソースです。 (また、main()
はint main(void)
である必要があり、'を追加しても問題はありません。 return 0;
終了前}
。)回答
暗黙の型変換が誤って正しいことを行うため、コードは機能しているようです。
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つの危険は、"最適化"の想定される利益のために動作を中断するように標準が変更される可能性があることです。int i=129; signed char c=i;
の型強制は、そのような動作の1つです。c
が'の場合、i
と等しくなる命令を持つプロセッサは比較的少数です。範囲は-127〜 + 127であり、i
の他の値から、2つとは異なる-128〜 +127の範囲の値への一貫したマッピングが生成されます' s-補数の削減、または…