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

    上一篇: C Programming Language Example About Arrays

    下一篇: radius: 50% not producing perfect circles in Chrome