我输入了一堆数字字符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);
}
答案 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。 ++0
将0
增加到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/