用C调试直方图

用C调试直方图,c,debugging,C,Debugging,这里的第一个问题是堆栈溢出,所以请原谅我,如果这是离题或不是根据礼仪,但它似乎应该是好的。我正在做K&R中的练习1-13,特别是打印输入中单词长度的垂直直方图。以下是我目前的代码: #include <stdio.h> #define UPPER 10 #define ABOVE (UPPER+1) main() { int i, c, wcounter, j; int wlengths[ABOVE]; int maxHistHeight; fo

这里的第一个问题是堆栈溢出,所以请原谅我,如果这是离题或不是根据礼仪,但它似乎应该是好的。我正在做K&R中的练习1-13,特别是打印输入中单词长度的垂直直方图。以下是我目前的代码:

#include <stdio.h>

#define UPPER 10
#define ABOVE (UPPER+1)

main()
{
    int i, c, wcounter, j;
    int wlengths[ABOVE];
    int maxHistHeight;

    for (i = 0; i <= ABOVE; ++i)        /* Initialize everything to zero */
        wlengths[i] = 0;

    wcounter = maxHistHeight = 0;

    while((c = getchar()) != EOF){      /* Count word lengths */
        if (c != ' ' && c != '\t' && c != '\n'){
            ++wcounter;
        } 
        else if (wcounter >= ABOVE){
            ++wlengths[ABOVE];
            wcounter = 0;
        }else if (wcounter != 0){   
            ++wlengths[wcounter];
            wcounter = 0;
        }
    }

    for (i = 1; i <= ABOVE; ++i)       /*For testing purposes. See if the array is holding correct values*/
        printf(" %d ",wlengths[i]);

    printf("\n");

    for (i = 1; i <= ABOVE; ++i)        /*Get the Maximum height for histogram */
        if (wlengths[i]>maxHistHeight)
            maxHistHeight = wlengths[i];

    printf("Histogram of length of words\n");   /* Print histogram */
    printf("----------------------------\n");

    for (i = maxHistHeight; i >= 0; --i){  /* Start at top of histogram, and go downwards */
        printf("\n");   
        for (j = 1; j <= ABOVE; ++j){      /*For each level of histogram, go through all the */
            if (i == 0 && j != ABOVE){     /*Arrays, and see if they contain an X in that level */
                printf(" %d ", j);
            }else if (i == 0 && j == ABOVE){
                printf(">%d",UPPER);
            }
            else if (wlengths[j]>=i){
                printf(" X ");
            }
            else{ 
                printf("   ");
            }    
        }           
    }
    printf("\n");    
}
我使用的数组大小为12(不确定您是否会这样说),第11个索引包含所有长度大于10个字母的单词。然而,当我打印出直方图时,它会在>10点打印出一个“X”,即使单词只有10个字母长。如果我输入这个:

1234567890
123457890
1234567890
我得到:

Histogram of length of words
----------------------------

                            X  X 
                         X  X  X 
 1  2  3  4  5  6  7  8  9  10 >10
我想我递增数组的方式一定有问题,所以我打印了数组的值,得到如下结果:

 0  0  0  0  0  0  0  0  1  2  0 
这与我正在打印的直方图不匹配。谢谢你的帮助

更新原始问题

因此,我将数组大小固定为容纳12个元素:10个用于容纳长度为1-10的单词,1个用于容纳长度大于10的所有单词,1个用于索引0,以便索引号与单词长度匹配。在我有一个只有11个元素的数组之前,当我需要它是12个元素时,但是当我打印出数组的值时,它显示了正确的值,但是在打印直方图时,它是不正确的。因此,考虑到这一点:

1234567890
1234567890
12345678901234567890
12345
我在数组中得到了这个(我正在从索引1打印到索引11),它是正确的:

 0  0  0  0  1  0  0  0  0  2  1 
但直方图打印输出不同:

Histogram of length of words
----------------------------

                            X  X 
          X                 X  X 
 1  2  3  4  5  6  7  8  9  10 >10

它们不应该是相同的吗?

您的数组在上面有维度
(=11),但您正在从
0
迭代到上面的
(=12)元素,即
在+1
(=12)元素之上。有效的索引范围仅为-1上方的
0
,因此您正在写入(并随后读取)超出分配数组的末尾

例如,您的初始化循环应为:

for (i = 0; i < ABOVE; ++i)        /* Initialize everything to zero */
    wlengths[i] = 0;
for(i=0;i
我认为您可能会感到困惑,因为C数组索引从0开始,而直方图需要表示从1到10的单词长度,如果单词长度>10,则表示11。您可以通过以下两种方式之一实现此目的:

(a) 调整差值为1,使长度为1的单词进入第1栏,长度为2的单词进入第1栏,以此类推,或

(b) 分配一个额外的元素(即,使数组比需要的元素大一个元素),并且不要使用元素0。这样,您就不必担心1的偏移量。

长度: 如果将数组声明为 事物 这样阵列就可以容纳LEN的东西了

索引: 但是数组元素是从 0到LEN-1 并可按以下方式访问: 事物[0],事物[1],…,事物[LEN-1]

因此,您通常会看到这样的循环: 对于(i=0;i 问题是您希望字长从1到10,因此需要
相应地调整数组索引。

好的,我想我明白你们的意思了。我的数组需要能够存储12个元素,假设我使用索引1-10表示字长1-10,使用索引11表示所有那些字长>10,最后,索引0被丢弃,因为我希望索引号与我的字长对齐。我将数组大小设置为12,或者比上限常量大2,这似乎成功了。以下是我的输出:

Histogram of length of words
----------------------------

                            X    
             X              X  X 
 1  2  3  4  5  6  7  8  9  10 >10
鉴于这一投入:

1234567890 
1234567890
12345
12345678901234567890

嗨,谢谢你的回复!我想我不明白。如果我将数组从0初始化为11(包括11),那么不应该给我一个包含12个元素的数组吗?谢谢@lambuncutive:是的,但是您的数组只声明了11个元素,因此您正在所分配数组末尾之外写入(和读取)一个元素。
1234567890 
1234567890
12345
12345678901234567890