0

ここでは、「codechef.com」からの質問を参照しています。ここでは、以下のコードを使用して、ユーザーから初期カウントを読み取ります。これは整数値を返します。

これは、scanf("%d", &n);. しかし、ほとんどの人は、このタイプの方法を使用してユーザーから情報を取得しています。

このコードの 1 行がわかりません。また、文字入力が整数に変換される場所もわかりません。

int readuint()
{
int n = 0;
char c = fgetc(stdin);
do {
n = n * 10 + (c - '0');
} while ((c = fgetc(stdin)) != '\n');
return n;
}

問題の項目はこの行です - この行n = n * 10 + (c - '0');は何をしているのですか??

完全なコードについては、http: //www.codechef.com/viewsolution/1221364をご覧ください。

4

1 に答える 1

4

入力が の場合123、ループの各反復で次の計算が行われます。

n =  0 * 10 + ('1' - '0');
n =  1 * 10 + ('2' - '0');
n = 12 * 10 + ('3' - '0');
assert(n == 123);

数字の文字コードは常に連続しており、'1' - '0'1 なども同様です。

数字の桁を数字に変換します。イディオムに慣れましょう。C コードでよく見かけます。


示されているコードは、さまざまな点でずさんです。

int readuint()
{
    int n = 0;
    char c = fgetc(stdin);
    do {
        n = n * 10 + (c - '0');
    } while ((c = fgetc(stdin)) != '\n');
    return n;
}

名前は符号なし整数 ( uint) を読み取っていることを示していますが、使用されている型は符号付きintです。(and and )は ではなく を返すため、 の型は であるc必要があります。EOF に遭遇したことを示す方法はありません。オーバーフローに対する保護はありません。入力内の数字以外に対する保護はありません。これらすべてを修正するには、かなり多くのコードが必要ですが、コードの基本的な自己保護は、次のようにする必要があることを意味します。intfgetc()getc()getchar()intchar

int readint(void)
{
    int n = 0;
    int c;
    while ((c = fgetc(stdin) != EOF && isdigit(c))
        n = n * 10 + (c - '0');
    if (c != EOF && c != '\n')
        ungetc(fp, c);
    return n;
}

オーバーフローに対する保護はまだありませんが、入力内の EOF および非数字に対する基本的な保護があります (改行または EOF 以外の文字は、次の読み取り操作のために戻すことによって再処理されます)。


'1'-'0' (char) = (int)1? この変換はどのように行われますか? From charto int: 整数コンテナーに割り当てているためint nですか?

Elchonon Edelsonが言ったように、'0'や ' 'などの文字定数は C では1整数定数であり ( charC++ では定数になります)、 および の値'0''1'非常に頻繁にそれぞれ 48 と 49 です (ただし、C 標準では保証されていません! )。だから、もちろん49 - 48を与えます。1

于 2013-06-27T00:13:51.873 に答える