怀疑使用数组和开关?

时间:2013-08-10 10:58:15

标签: c arrays switch-statement

声明ndigit[c-'0']的作用是什么? 我正在使用ansi c。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    int c, i, ndigit[10];
    for(i = 0; i < 10; i++)
        ndigit[i]=0;
    while((c = getchar())!= EOF)
    {
        switch(c)
        {
            case '0' :case '1' :case '2' :case '3' :case '4' :case '5' :case '6' :case '7' :case '8' :case '9' : ndigit[c-'0']++;
            break;
        }
    }
    printf("digits=");
    for(i=0;i<10;i++) printf("%d",ndigit[i]);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

c是ascii字符值(尽管存储在整数类型中)。例如字符'0'在ascii中是48,所以如果getchar返回字符'0',那么c将具有整数值48。

c - '0'减去两个字符值(ok,它在减去之前将'0'转换为整数48),给出一个准备索引到数组中的整数。

因此char'1'变为整数1,char'2'变为整数2,等等。

对于已知的一组值,这只是从ascii字符值转换为整数值的快速方法。对于超出预期范围'0' - '9'的字符,它会产生奇怪的结果 - 例如如果你用字符“+”做这个,你会得到-5这不是一个好的数组索引。但是没关系,因为switch语句检查它是否在'0' - '7'范围内。