-1

私は現在、C を学習する方法として Project Euler の問題に取り組んでおり、問題 8 に問題があります。実際の数学とプログラムの主要なビットは問題ありませんが、この方法では大きな (1000 桁) から個々の桁を読み取る必要があります。番号をファイルに入れました。

以下のコードは、私のファイル「test.txt」が番号「123456789」であるテストケース用です。私がやろうとしているのは、各桁を別々の行に出力することです。

#include <stdio.h>

int main()
{
    int c = 0;
    FILE *fp;
    fp = fopen("test.txt", "r");

    while(c != EOF)
    {
        c = fgetc(fp);
        printf("%i\n", c);      

    }

    fclose(fp);

}

このコードを実行すると、出力が得られます

49
50
51
52
53
54
55
56
57
10
-1

私のコードから本当に単純なものが欠けている予感があります。それは fgetc ビットにあると思います。この場合、使用するより良い関数は何でしょうか。また、なぜこのような奇妙な出力が得られるのかにも興味があります。1000 桁の数字で試してみると、49 前後から 50 程度までの数字で同様のパターンが見つかります。ほぼ周期的に出力されます。私はCの初心者に過ぎないことを覚えておいてください。

4

4 に答える 4

2

これらは数字のASCIIです。

48 = '0'
49 = '1'
50 = '2'

など。テキストファイルに格納された整数の数字を表す文字であるため、その形式になっています。

印刷する必要があります:

if((48 <= c) && (c <= 57))
  printf("%d\n", c - '0');

注:if10は改行で、-1はEOFであるため、そのチェックが必要になります。必要以上に印刷しています。

もちろん、チェックすればこれを行う方法はたくさんあります:

if(('0' <= c) && (c <= '9'))

また

if(isdigit(c))

ポイントは、数字だけが必要かどうかを確認する必要があるということです。

于 2012-12-21T15:00:06.540 に答える
1

printf("%i\n", c);各数値のASCII文字コードを出力します。

以下のコードは、各文字が数字であるかどうかをチェックし、数字を出力するか(0の文字コードを減算することにより)、数値以外のコンテンツが検出された場合は警告を出力します。

while(c != EOF) {
    c = fgetc(fp);
    if (isdigit(c)) {
        printf("%i\n", c-'0');
    }
    else {
        printf(" non-numeric digit (%i)\n", c);
    }
}
于 2012-12-21T14:57:45.983 に答える
1

これは、数値のASCII値を印刷しているように見えます。ウィキペディアのASCIIテーブルのスニペットは次のとおりです。

Dec Hex Glyph
48  30  0
49  31  1
50  32  2
51  33  3
52  34  4
53  35  5
54  36  6
55  37  7
56  38  8
57  39  9

最後に取得する10-1は、改行とEOFです。

ファイルからテキストを読み込むと、ASCII文字データが提供されるため、値から文字「0」のオフセットを減算して、代わりに数値を取得する必要があります。

printf("%d\n", c - '0');

'0'コンパイラが適切な数値に変換するため、減算で文字を直接使用できることに注意してください。48を引くだけでなく、 'を使用する'0'ことをお勧めします。これは、何をしようとしているのかが明確であり、文字エンコードが異なる可能性があるためです。

于 2012-12-21T14:57:54.473 に答える
0

各数値のASCII値を出力し、EOFも出力しています。これは、読み取り後ではなく読み取り前にチェックするためです。

while((c = fgetc(fp)) != EOF)
{
    printf("%i\n", c-'0');
}
于 2012-12-21T15:01:09.930 に答える