1

私はcチュートリアルを読んで、このコードを正しくコンパイル/動作させるために多くの時間を費やしました(cを吸うように)、そしてstrtolを使用する代わりに、よりクリーンでクリーンな方法が何であるかを知りgetchar(c)たいcです配列chstr[]を使用strtolchstrます。

isdigitチェックを手伝ってくれたLachlanpsに感謝します

int main()
{
    char c;

    while((c = getchar()) !=EOF) {
        if (!check_chr(c)) {
            return 0;
        }
    }

    return 1;
}

int check_chr(char c)
{
    int a; char chstr[2];
    if (isdigit(c)) {
        chstr[0] = c; chstr[1] = "/0";
        a = (strtol(chstr,0,0));
        i = i + a;
        return 1;
    }

    if (c == ',')
        return 1;

    if (c == '\n')
        return 1;

    return 0;
}
4

2 に答える 2

3

1桁の数字を保持する文字を2進数に変換するには、のエンコードされた形式を減算するだけです'0'。これは、Cが文字エンコードの連続した場所に0..9があることを保証するために機能します。

int digit_to_number(char c)
{
  if (isdigit(c))
    return c - '0';
  return -1;
}

これが機能'0'するのは、 ínCが、ターゲットマシンのエンコーディングで表すために使用される値に評価される、型指定されたint(はいintchar予想どおりではない)式であるためです。0たとえばASCIIまたはUTF-8エンコーディングをネイティブに実行しているマシンの場合、この値は(10進数)48です。EBCDICを実行しているシステムの場合、値は(10進数)240です。

文字リテラルを使用すると、文字の数字がコンパイラの問題である数値に変換されます。これはもちろん、その方法です。

于 2012-04-16T10:53:55.933 に答える
1

さて、あなたは手動で数を解析することができます。そんな感じ:

if (c >= '0' && c <= '9')
    number = c - '0';
else
    // error: c is not a decimal digit.

(コメントの代わりにエラー処理コードを入れてください)

于 2012-04-16T10:53:03.973 に答える