-1

これをコンパイルしました(gccコンパイラ):

#include< stdio.h>

 main() {

    unsigned char ch;
    FILE *fp;
    fp=fopen("trial","r");
    while((ch=getc(fp))!=EOF)
        printf("%c",ch);
    fclose(fp);
}

それは以下を与える:

Warning: comparison is always true due to limited range of the data type

実行すると、文字の無限のストリームが端末に出力されます。(プログラムをコンパイルする前に「trial」という名前のファイルを作成し、ファイルにテキストを書き込んだと仮定します。)

警告を教えてください.....

4

4 に答える 4

1

EOF は -1 であり、あなたchは unsigned char であるため、ch は決して -1 にはなりません。

代わりに使用int ch;

于 2012-04-07T16:37:08.370 に答える
0

getc()を返しますint。その割り当てで切り捨てている (そして符号を変更している)unsigned charため、一致することはありませんEOF。のタイプをchto に変更するだけintで問題ありません。

于 2012-04-07T16:36:08.927 に答える
0

getc正当な理由で整数を返します。EOF インジケータは通常の文字の範囲外です。そうしないと、正当な文字と EOF インジケータを混同する可能性があるためです。ただし、値の制限内に収まるように回答を制限する文字に結果を割り当てていcharます。要するに、この方法ではいつファイルの終わりに到達したかを知ることはできません。"ch" を型にするか、呼び出しの結果を EOF と比較したに型intに代入します。getcunsigned char

于 2012-04-07T16:37:19.273 に答える
0

CのEOF値は anですがintchここでは acharです。char型が小さいため、表現できるint値よりも少ない値を表すことがintできます。 は、単に表すことができないEOF値の 1 つであり、したがってと等しくなることはありません。charchEOF

このシナリオでgetcは、実際には を返すintため、 を表すことができEOFます。しかし、すぐにそれを に縮小し、char余分な情報を失います。

これを正しく書く方法は次のとおりです。

int cur;
FILE *fp;
fp=fopen("trial","r");
while((cur = getc(fp))!=EOF) {
  unsigned char ch = cur;
  printf("%c",ch);
}
fclose(fp);
于 2012-04-07T16:40:47.893 に答える