K& R 1.6样本代码显示长整数

时间:2016-10-23 11:12:51

标签: c arrays

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中工作。)

怎么了?

1 个答案:

答案 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个初始化分配,因此值为 - 而不是零 - 未定义,因此它们包含随机(任意)值。