C阵列计数(初学者)

时间:2013-07-23 10:28:01

标签: c arrays kernighan-and-ritchie

我正在阅读Kernighan& amp;的'C编程语言'。里奇和我正在努力弄清楚线路的作用。我想我只是有点愚蠢,并不太了解他们的解释。

++ndigit[c-'0'];

我必须稍微更改程序,因为ndigit之前给了我垃圾值,所以我只是将数组实例化为0,而不是使用for循环遍历它,并更改值方式。

#include <stdio.h>

main()
{
    int c, i, nwhite, nother;
    int ndigit[10]= {0};

    nwhite = nother = 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);
}  

使用该程序作为输入,我们将其打印到控制台 -

digits = 7 2 0 0 0 0 0 0 0 1, white space = 104, other = 291

我知道7 2 0 0 0 0 0 0 0 1是输入0中出现的单个数字出现次数的次数是7次,1次出现两次等等。)

但是,...[c-'0'];'如何运作?

8 个答案:

答案 0 :(得分:4)

您询问以下表达式的工作原理

 c-'0'

输入的字符的ASCII码从ASCII码0中减去,它定义了数组中必须存储计数的位置。

假设您从键盘输入 1 1 的ASCII代码为49, 0 的ASCII代码为48。 因此

   49-48 =1 

并且计数将存储在数组索引位置1中。

答案 1 :(得分:3)

c-'0'是将int值==赋予char数的技术,例如1'1'5'5'

字符符号'0', '1', '2' ..... '9'被分配了继续编码值,因此数字字符常量与'0'的差异给出了十进制数。 (在您的编译器中,例如在ASCII char中,它们被分配了连续的acsii值)。

例如,变量c中的'7'c - '0',然后7 == int ndigit[10]= {0}; // default initialized with `0` ;

在声明为:

的代码数组中
0

因此索引可以从9++ndigit[c-'0']; // ndigit[c-'0'] = ndigit[c-'0'] + 1; 。所以你的代码:

1

在数字char的相应位数处将数字的频率增加{{1}}。

答案 2 :(得分:3)

在C中,当你有一个char类型的变量c时,它实际上存储了char的一些整数编码(通常是ASCII代码)。因此c-'0'表示c中包含的字符代码与字符0的差异。由于数字是自然顺序,因此它会转换相关数字中的数字。

答案 3 :(得分:2)

C标准要求字符'0'到'9'具有连续值。

'0'表示零值作为字符,c表示您输入的值计算如下:

  

'1' - '0'== 1

     

'2' - '0'== 2

等等......如果c数字

,则等于c的值

答案 4 :(得分:2)

Ascii是一种编码,它为连续的数字提供连续的id。正如Eric Postpischil指出的那样,标准要求属性,即使底层编码不需要ascii。 Ascii虽然很常见。

char c1 = '0';
char c2 = '1';

因此,无论'0'被映射到哪个数字,'1'都将是该数字+ 1.本质上:

c2 == c1 + 1

从作为数字的字符中减去'0',将返回其数值:

'1' - '0' == 1

答案 5 :(得分:1)

以ASCII wikipedia加载。

  

美国信息交换标准码(ASCII /æski/ ass-kee)1是一种字符编码方案,最初基于英文字母编码128个指定字符 - 数字0-9,字母az和AZ,一些基本的标点符号,一些源自Teletype机器的控制代码,以及一个空格 - 进入7位二进制整数。

所以在ASCII方案中,'0'字符是数字48,字符'1'是41,依此类推。因此c - '0'相当于c - 48.如果c为'1',则表达式变为49 - 48 = 1.因此在少数单词'c' - '0'中转换一个数字char ['0' - '9 ']为整数[0-9]。

编辑1 正如@Eric Postpischil所建议的,ASCII不是ANSi C(也不是c ++)的一部分。但是很常见,我知道的所有编译器都使用ASCII集。

答案 6 :(得分:1)

((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];

c为您提供当前角色。通过范围检查,您确认它是一个数字by using its ASCII value 检查chr的{​​{1}}列,048 856 '8'- '0' 56 - 48 }} = 8

ndigit用于跟踪数字出现的次数,其中数组的每个元素表示其下标发生的次数。 ndigit[0]会给您0发生的次数等等ndigit[x] x给出[c - '0'] 出现的次数

c

假设您的8,即当前字符为'8' - '0',则8将为您提供ndigit[8]。所以你得到++0这个值[你在开始时将它初始化为{{1}}]

答案 7 :(得分:0)

'0'是一个char,它的值为48.您可以在google中查找任何ASCII表。 它以这种方式工作,因为你从输入字符值读取而不是int,所以如果你不添加“-'0”部分,它将增加数组的第48个单元格。 而不是“-'0”,你可以放“-48”,在我看来,这种方式更具可读性。