计算C中的数字

时间:2018-02-02 04:40:31

标签: c

我输入了一堆数字字符3 4 5 6 6。代码将结果返回给我

digits = 0 0 0 1 1 1 2 0 0 0, white space = 5
, other = 0.

我不明白为什么"数字"给我这样的结果0 0 0 1 1 1 2 0 0 0。任何人都可以解释为什么计算机会这样做?

#include<stdio.h>

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\n, other = %d\n", nwhite, nother);
}

1 个答案:

答案 0 :(得分:2)

他们在此声明中理解此问题的关键是:++ndigit[c-'0'];

程序首先创建一个数组:

int ndigit[10]; /* creates an array of size 10 */

c创建数组时,只需要一块内存。那个记忆中的内容是未定义的。在更现代的语言中,您可能会获得10个零的数组,但是在c中,当您第一次创建它时,您可能会有垃圾数据。

通过代码,您应该能够确定程序如何准备阵列以供使用。它确保数组中每个索引的每个值都设置为0

此时你的数组和它的索引看起来像这样:

[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] /* array   */
  0  1  2  3  4  5  6  7  8  9   /* indices */

因此,如果您要运行ndigit[0],您将获得索引0的值,即0

c = getChar()从输入中获得1个字符(您输入的数字)。但此时程序只会将这些数字视为char类型,而不是int。这是您需要了解ASCII的地方。您的第一个char输入是'3'。其ASCII值为51。该程序执行此数学运算:'3'-'0'。它减去了两个chars。这是可能的,因为c只是减去这些ASCII的{​​{1}}值,chars真正51-48等于3

++运算符递增一个值:ie。 ++00增加到1。我不会进入pre vs post增量,因为您稍后会了解到这一点。

既然你拥有了所有这些,我的建议是绘制一个数组ndigit及其值和索引以及c(当前char)的值的图片看起来好像在while循环的每次迭代结束时。对while循环的每次迭代执行此操作,您将看到为什么您看到的输出有意义。

即:

c = 3
[ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 ] /* array   */
  0  1  2  3  4  5  6  7  8  9   /* indices */

c = 4
...
...

/* and so on */

以下是指向有用的ASCII表格指南的链接:http://www.asciitable.com/