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