在这个数组索引中减去什么点?

时间:2011-02-20 03:37:28

标签: c arrays

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 个答案:

答案 0 :(得分:4)

0的ASCII字符不是实际的零字节\0。因此,如果你做a['0'],你实际上会在a[48](在ASCII系统上),因此减去'0'会将数字转换为整数值。

答案 1 :(得分:2)

getChar()返回一个字符。所以c-'0',如果c =='0'。得到整数0。

答案 2 :(得分:2)

在这种情况下,当您使用getchar()时,它返回一个int,但值为char。在字符中,数字“0”到“9”实际上并不是以数字形式存储为0到9,而是存储为48到57.也就是说“0”与0不同,但实际上与48相同。因此,在在这种情况下,假设c为'0'。如果你刚刚做了nDigits [c]它就像nDigits [48]那样你想要的是nDigits [0]所以你需要做nDigits [c - '0']转换为nDigits [48 - 48]是nDigits [0] ......这就是你想要的!

答案 3 :(得分:1)

ndigit [c]会在ascii值'0' - &gt;'9'或48-57附近找到一个数组索引。通过减去“0”,可以将其降低到0到9范围。