C编程语言示例关于数组
我正在使用经典K&R书“The C Programming Language”,第二版。
在第24页关于数组的练习中,我遇到了这个问题。
练习说(从PDF复制并粘贴):
#include <stdio.h>
/* count digits, white space, others */
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, other = %dn",
nwhite, nother);
}
在这种情况下,本书说运行该程序后输出如下。
在这一点上,这本书很混乱,因为它没有说打字的人......
该程序本身的输出是数字= 9 3 0 0 0 0 0 0 0 1,空白= 123,其他= 345
好的,现在我将从书中复制代码
这是我从Eclipse复制并粘贴的练习:
#include <stdio.h>
#include <stdlib.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(" After ");
printf(" Var c %d n", c);
printf(" Var i %d n", i);
printf(" Var nwhite %d n", nwhite);
printf(" Var nother %d n", nother);
printf(" Digits are = ");
for (i = 0; i < 10; ++i)
printf(" %d ", ndigit[i]);
return EXIT_SUCCESS;
}
当我运行它并输入类似如下内容时:
abc def ghi jkl 123
我获得这个输出:
Var c -1 Var i 10 Var nwhite 4 Var nother 13数字= 0 1 1 1 0 0 0 0 0 0
恢复:
我的代码只与最后一行中的原始代码不同,因为我使用此printf来查看变量的值。
并且我重命名/ || c ==' n'/因为不想把它算作nwhite。
其余的我认为这是平等的,似乎工作很好喜欢书的例子。
题:
为什么他们告诉我的例子的价值?
我的问题是,我不明白这个输出方式,或者它与我输入的信息有关:
输入:abc def ghi jkl 123
输出:数字= 0 1 1 1 0 0 0 0 0 0
最后:
我希望对此有任何解释,说这本书对我而言并不清楚,并且不真正了解这些价值观正在显示。
05/06/2014新增:
解决我的问题。
Firts
首先我要感谢大家对这个问题的帮助(本书的链接),我认为它是在公共领域。 我会在将来的帖子中考虑到这一点。
非常感谢:WhozCraig和Amir提供了宝贵的意见,并感谢他们终于明白了这个练习。
当然,为了确保我理解下一步是执行验证,以帮助未来的读者澄清这篇文章:
为了验证我明白我做了以下测试:
在这个新案例中,我们介绍以下系列;
ab cd ef gh 1234136
After Var c -1
Var i 10
Var nwhite 4
Var nother 9
Digits = 0 2 1 2 1 0 1 0 0 0
事实上0,现在磨片有2个(个)1(二)2(三分球)1(四)个,我故意省略了五检查0(五岁以下儿童的OK),最后1(SIX),与下一次7,8和9是empy。
那是 !!!
分析输出:
After Var c -1 Var i 10 Var nwhite 4 Var nother 13 Digits are =0 1 1 1 0 0 0 0 0 0
c -1
:你完成了你的读循环与c
等同于EOF,你的平台上为-1
。 i 10
:当i < 10
不再是真的时for (i = 0; i < 10; ++i)
的循环被打破了。 最后一次碰到的是最后一个增量, ++i
,这导致i
成为了10
并且从那以后一直没有被触及。 nwhite 4
:有四个空白非换行符(因为你删除了它)在你输入的字符序列中的字符: abc def ghi jkl 123
nother 13
:换行符被视为您的修改中的“其他”字符,数字不是。 因此, abcdefghijkln
是促成这种积累的十三个值。 这留下了最后一项:
Digits are =0 1 1 1 0 0 0 0 0 0
当你浏览输入数据循环时,遇到数字字符( '0'..'9'
)时,它的ASCII值(或者,如果你在iSeries或zSeries上运行,它的EBCDIC值) char'0 '0'
,创建一个基于零的索引到一个由10个整数组成的数组中。 这是有效的,因为标准要求每个数字字符的代码点都是连续的和连续的,并且所有平台(包括EBCDIC)都会遵守这一点。 数组中该索引处的计数器会随着相应数字字符的每次遇到而递增。 完成后,生成的数组内容被转储到标准输出。 你有一个数字,分别是'1'
, '2'
和'3'
。 数组中的第一个插槽为'0'
,下一个为'1'
等0 1 1 1 ...
表示零,一,二,三等的数目。
有关ASCII值的更多信息,请参阅此表。 如果倾向于看到与EBCDIC的差异,请参阅此表,并注意,尽管两者的实际数值不同,但完整序列'0'..'9'
是连续的。
希望有所帮助。 产生的问题,顺便说一句。 特别是您的第一篇文章。
我现在正在阅读这本书,这里是我对此的理解。
你得到的输出是正确的:
c = -1
,因为while循环退出时(c = getchar())
达到EOF
(明知EOF等于-1),并且记住要存储在的getchar() c
与比较之前EOF
因为括号已优先级更高。 因此,条件为:c = EOF,然后将getchar()与EOF进行比较并退出while循环
i = 10
因为你正在循环使用for循环,当i
到达10时,它应该停止。 因此,在最后一个值店i
是10。
0 1 1 1 0 0 0 0 0 0
意味着,你有
0 Zero
1 ONE
1 TWO
1 THREE
0 FOUR
etc...
PS:这是一本很棒的书!
链接地址: http://www.djcxy.com/p/20747.html