在每种情况下,这个数组都在做什么?

时间:2015-02-01 22:20:39

标签: c

我正在读K& R书,我被困在阵列(介绍中)。我不想在这个问题中加入更多问题,但这里的“一般性问题”是我不明白如何使用数组,我觉得这本书在介绍中解释得非常糟糕。 该程序对数字(分开),空格和其他数字进行计数。

#include <stdio.h>

int main(void)
{
    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(", blanks = %d, other = %d\n", nwhite, nother);

    return 0;
}

我确实理解第一个'for'是将ndigit[i]的每个值都设为0.之后我丢失了它。它说“如果i等于0或9,那么ndigit[c-'0']是什么意思?”真的,那是什么'0'。最后一部分是它使用i制作了另一个“for”,如果i在ndigit中,i的值会发生什么? 我不应该问这个;这太新手但我不知道还能在哪里得到帮助。

7 个答案:

答案 0 :(得分:1)

数字'0' .. '9'的字符代码是连续数字,通常是48 .. 57.如果c'0'到{{1}的范围内('9'测试已检查过),如果字符为if,则ndigit[c-'0']++会增加下标0的计数,如果'0',则为9增加字符为'9',两者之间的值类似。 (请注意,您可以使用任何整数值表达式作为下标 - 但该值必须在数组的有效下标范围内,或者行为未定义 - C中的专用术语表示'任何事情都可能发生,包括它可能像预期的那样工作,或者使程序或计算机崩溃,或者......任何东西'。)

C要求10位数字具有连续的代码值,'0'编码低于'1'。请注意,用于将0视为10的电话(很难发现0次点击,但在旋转手机的日子里很难发现10次点击)。

答案 1 :(得分:0)

c-'0'将字符转换为整数:

  • '0'变为整数0
  • '1'变为1
  • ...

因此,ndigit[c-'0']指的是当前字符的计数器。

答案 2 :(得分:0)

在C中,为每个角色分配一个值。您可以查看here '0'的值为 48 '9'的值为 57

由于c-'0'中的ndigit[c-'0']需要是 0 9 之间的值,您只需减去'0'

答案 3 :(得分:0)

c == '0'时,c-'0'等于0c == '9'时,c-'0'等于9

您可以在c介于'0' - '9'之间时插值。

c-'0'等于0时,

++ndigit[c-'0'];

增加ndigit[0]的值。

c-'0'等于9时,

++ndigit[c-'0'];

增加ndigit[9]的值。

您可以插入c介于'0' - '9'之间的内容。

答案 4 :(得分:0)

使用c-'0',您将从ASCII值获得实数值。

看看ASCII table。您可以使用'1'加载的字符getchar()具有ascii值 49 。如果您从中减去字符'0'的值,则会得到实数值 1

答案 5 :(得分:0)

所以开始关闭while循环直到你输入End of File(在Windows Ctrl + Z上;在Unix系统上Ctrl + D

在此之前,它每次都会读取1个字符。然后它通过if语句来检查它是一个数字(0-9)还是一个新行(\n),空格([space here]),tab({{ 1}})或其他。

它增加(+1)特定变量或增加数字的特定数组索引。 (这个:\t是将字符转换为int,因此您可以访问该数组并增加特定值,这预示着您已使用0初始化数组。)

最后会打印您输入的字符/数字。

答案 6 :(得分:0)

在计算机的内存中,所有字符都用整数表示,即它们的代码

在C程序中,根据使用的编码,'0'(一个char字面值)本质上是字符0的整数值(代码)。 在现代系统中,字符0的代码为48,字符1的代码为49等(请参阅ASCII encoding。)因此,'0' == 48'1' == 49等。

在此程序中,字符数字(即数字的代码)将转换为数字的数值,因此ndigits[0]将计为零,ndigits[1]将计为1,等等。c - '0'执行此转换,使用数字编码密集且编码表中的数字有序的事实

 c  |  c - '0'
----+--------------------------
'0' |  '0' - '0' = 48 - 48 = 0
'1' |  '1' - '0' = 49 - 48 = 1 (Code of '1' is 49.)
'2' |  '2' - '0' = 50 - 48 = 2 (Code of '2' is 50.)
   ...
'9' |  '9' - '0' = 57 - 48 = 9

ndigits[i]表示i - 数组ndigits的项目。例如。当i为0时,ndigits[i] = ndigits[0] =数组的第一个(索引从0开始)项。