K& R的第1.6章给出了计算数字,空格和其他字符的示例代码。接下来是他们的代码,加上返回0行。
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 == '\t' || c == '\n')
++nwhite;
else
++nother;
printf("digits=");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other =%d\n",
nwhite, nother);
return 0;
当我运行它时,无论输入什么,我得到一长串整数(1-7位数,一些正数,一些负数,无论输入都一致),0-9的计数应该是多少。流程确实返回0.
(虽然在How to enable Ctrl+C/Ctrl+V for pasting in the Windows command prompt上遵循了这些说明,但仍会复制并粘贴样本,但也无法让它在cmd中工作。)
怎么了?
答案 0 :(得分:1)
查看代码的这一部分:
for (i = 0; i < 10; ++i);
ndigit[i] = 0;
它与此相同(我只将第一行拆分为两行而不是第二行):
for (i = 0; i < 10; ++i)
;
ndigit[i] = 0;
因此for
循环具有空体 - 它只会将变量i
增加到达到值10
时的点。
所以下一个命令
ndigit[i] = 0;
这样做:
ndigit[10] = 0;
它与你的意图完全不同 - 你想要执行此操作:
ndigit[0] = 0;
ndigit[1] = 0;
ndigit[2] = 0;
.
.
ndigit[9] = 0;
由于您没有执行这10个初始化分配,因此值为 - 而不是零 - 未定义,因此它们包含随机(任意)值。