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];
或者我是否完全以错误的方式看待这个问题?
答案 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范围。