Какой смысл вычитать в этом индексе массива? - PullRequest
1 голос
/ 20 февраля 2011
main()
{
    int c, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i=0; i<10; i++)
        ndigit[i]=0;

    while((c=getchar()) != EOF)
        if(c>='0' && c<='9')
            ++ndigit[c-'0'];
        else if(c==' ' || c=='\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("digits =");
    for(i=0; i<10; ++i)
        printf(" %d", ndigit[i]);
    printf(", white space = %d, other = %d\n", nwhite, nother);


}

Какой смысл иметь такой индекс?++ndigit[c-'0']; В противоположность этому: ++ndigit[c]; или я совершенно неправильно смотрю на это?

Ответы [ 4 ]

4 голосов
/ 20 февраля 2011

Символ ASCII для 0 не является действительным нулевым байтом \0. Таким образом, если бы вы сделали a['0'], вы бы на самом деле выполняли a[48] (в системе ASCII), и, таким образом, вычитая '0' преобразует цифру в целочисленное значение.

2 голосов
/ 20 февраля 2011

В этом случае, когда вы используете getchar (), он возвращает int, но со значениями char. В символах числа от 0 до 9 на самом деле хранятся в числовом виде не от 0 до 9, а от 48 до 57. То есть «0» - это не то же самое, что 0, но фактически то же, что и 48. Поэтому в в этом случае, скажем, с '0'. Если вы только что сделали nDigits [c], это было бы то же самое, что и nDigits [48], когда вам нужно nDigits [0], поэтому вам нужно сделать nDigits [c - '0'], что переводится в nDigits [48 - 48], что это nDigits [0] ... это то, что вы хотите!

2 голосов
/ 20 февраля 2011

getChar () возвращает символ.Так что c-'0 ', если c ==' 0 '.приводит к целому числу 0.

1 голос
/ 20 февраля 2011

ndigit [c] даст вам индекс массива где-то около значения ascii '0' -> '9' или 48-57. Вычитая «0», вы уменьшаете его до диапазона от 0 до 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...