为什么arr [1]打印出似乎是arr [0]的内容?

时间:2014-01-14 11:00:43

标签: c arrays for-loop

以下程序来自“The C Answer Book”,练习1-13。这是为了理解&自学。


我为下面的问题设置了舞台:


#define MAXWORD 11

数组wl []的元素初始化为零。

/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
    wl[i] = 0;
}

如果字大小大于零且小于最大值,请将它们存储在数组中。

if (nc > 0) {
    /* INCREMENT WORD LENGTH COUNTER */
    if (nc < MAXWORD) {
        ++wl[nc];
    }
    ...
}

以下循环以i = 1开头。为什么wl [1]打印出似乎是wl [0]的内容?

/* PRINT COUNTER HEADER */
for (i = i; i < MAXWORD; ++i) {
    printf("%5d - %5d : ", i, wl[i]);
    ...
}

¡EXTRA CREDIT!

请教我如何自己找到答案。


i = 0

时的输出
 0 -     0 : 
 1 -   111 : ************
 2 -   129 : ***************
 3 -    31 : ***
 4 -    42 : ****
 5 -    32 : ***
 6 -    24 : **
 7 -    24 : **
 8 -    13 : *
 9 -    17 : *
10 -     6 : *
There are 9 words >= 11

i = 1时的输出

 1 -   111 : ************
 2 -   129 : ***************
 3 -    31 : ***
 4 -    42 : ****
 5 -    32 : ***
 6 -    24 : **
 7 -    24 : **
 8 -    13 : *
 9 -    17 : *
10 -     6 : *
There are 9 words >= 11

完整的源代码:

/* Write a program to print a histogram of the lengths of words in
 * its input. It is easy to draw the histogram with the bars horizontal; a vertical
 * orientation is more challenging. 
 *
 *  1   |   ***
 *  2   |   ****
 *  3   |   ******
 *  4   |   *********
 *  5   |   **
 *  X   |   **********
 *  
 *  There were 7 words greater than 11 character.
 *  --------------------------------------------- */

#include <stdio.h>

#define MAXHIST 15                                  /* max length of histogram */
#define MAXWORD 11                                  /* max length of a word */
#define IN      1                                   /* inside a word */
#define OUT     0                                   /* outside a word */

/* print horizontal histogram */
int
main(void)
{
    int c, i, nc, state;
    int len;                                        /* length of each bar */
    int maxvalue;                                   /* maximum value for wl[] */
    int ovflow;                                     /* number of overflow words */
    int wl[MAXWORD];                                /* word length counters */

    state = OUT;
    nc = 0;                                         /* number of chars in a word */
    ovflow = 0;                                     /* number of overflow words */
    /* INITIALIZE WORD LENGTH COUNTER */
    for (i = 0; i < MAXWORD; ++i) {
        wl[i] = 0;
    }
    /* READ CHARACTERS UNTIL EOF */
    while ( (c = getchar() ) != EOF) {
        /* IF BLANK FOUND */
        if (c == ' ' || c == '\n' || c == '\t') {
            state = OUT;
            /* IF WORD FOUND */
            if (nc > 0) {
                /* INCREMENT WORD LENGTH COUNTER */
                if (nc < MAXWORD) {
                    ++wl[nc];
                }
                /* INCREMENT OVERFLOW COUNTER */
                else {
                    ++ovflow;
                }
            }
            nc = 0;
        }
        /* NEW WORD FOUND */
        else if (state == OUT) {
            state = IN;
            nc = 1;                                 /* beginning of a new word */
        }
        /* SAME WORD FOUND */
        else {
            ++nc;                                   /* inside a word */
        }
    }
    maxvalue = 0;
    /* FIND LARGEST WORD */
    for (i = 1; i < MAXWORD; ++i) {
        if (wl[i] > maxvalue) {
            maxvalue = wl[i];
        }
    }
    /* PRINT COUNTER HEADER */
    for (i = 1; i < MAXWORD; ++i) {
        printf("%5d - %5d : ", i, wl[i]);
        /* FIND A COUNTER */
        if (wl[i] > 0) {
            /* SCALE ITS HISTOGRAM */
            if ( (len = wl[i] * MAXHIST / maxvalue) <= 0) {
                len = 1;
            }
        }
        /* NO COUNTER FOUND */
        else {
            len = 0;
        }
        /* PRINT COUNTER LENGTH */
        while (len > 0) {
            putchar('*');
            --len;
        }
        putchar('\n');
    }
    /* PRINT OVERFLOW COUNT */
    if (ovflow > 0) {
        printf("There are %d words >= %d\n", ovflow, MAXWORD);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

因为没有单词的长度为0,并且wl[0]中没有任何内容存储,所以请参阅if(nc > 0)

索引是单词的长度,该索引处的值是该长度的单词数。

一段文字中长度为0的单词数量更像是一个哲学问题,而不是计算机可以计算出来的东西。

答案 1 :(得分:0)

代码运作良好:wl存储长度等于或小于10的字数(wl[1]长度为1的字数,wl[2]长度为2的单词,等等,所以wl[0]总是0,因为不存在长度为0的单词。

有时当你使用数组时,你想要忘记数组的位置从0到n-1并简化代码的其他部分,这就是这里发生的事情。

这是如何使用索引0

#define MAXWORD 10                                  /* max length of a word */

...

int wl[MAXWORD];                                /* word length counters */  

/* INITIALIZE WORD LENGTH COUNTER */
for (i = 0; i < MAXWORD; ++i) {
    wl[i] = 0;
}

...


/* IF WORD FOUND */
if (nc > 0) {
    /* INCREMENT WORD LENGTH COUNTER */
    if (nc <= MAXWORD) {
        ++wl[nc - 1];
    }
    /* INCREMENT OVERFLOW COUNTER */
    else {
        ++ovflow;
    }
}

...

for (i = 0; i < MAXWORD; ++i) {
    printf("%5d - %5d : ", i+1, wl[i]);

    ...
}

++wl[nc - 1];printf("%5d - %5d : ", i+1, wl[i]);很难理解这个例子。 代码还可以,但是,对于澄清我认为作者试图做的事情,我会建议这个

#define MAXWORD 10                                  /* max length of a word */

...

int wl[MAXWORD + 1];                                /* word length counters */  

/* INITIALIZE WORD LENGTH COUNTER */
for (i = 1; i < MAXWORD; ++i) {
    wl[i] = 0;
}

...


/* IF WORD FOUND */
if (nc > 0) {
    /* INCREMENT WORD LENGTH COUNTER */
    if (nc <= MAXWORD) {
        ++wl[nc];
    }
    /* INCREMENT OVERFLOW COUNTER */
    else {
        ++ovflow;
    }
}

...

for (i = 1; i <= MAXWORD; ++i) {
    printf("%5d - %5d : ", i, wl[i]);

    ...
}