制作不同字符出现次数的直方图

时间:2011-08-17 20:46:09

标签: c

只是您的标准C入门程序。我正在尝试打印出用户输入的所有不同字符的直方图。

#include <stdio.h>


#define LIMIT 255


main(){
int asciiArray[LIMIT], input, outer, inner;

while((input = getchar()) != EOF){
    asciiArray[input] = ++asciiArray[input];
    //printf("%d\n", asciiArray[input]);
}
for(outer = 0; outer <= LIMIT; outer++){
    if(asciiArray[outer] < 0){
        putchar(outer);
        printf("\t");
        for(inner = asciiArray[outer]; inner > 1; inner--)
            printf("*");
        printf("\n");       
    }
    else
        ;
}

}

这些是用户输入“h”时的结果:

h0
2
9
?
@
C
G
J
K
U
Z
a
b
h
j
l
n
q
}
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�
�

3 个答案:

答案 0 :(得分:6)

对于初学者,您没有初始化asciiArray,因此它可能包含所有内容。

尝试memset(asciiArray, 0, sizeof(asciiArray));int asciiArray[LIMIT] = {0}

此外,您可以将while中的增量简化为:asciiArray[input]++

for看起来很可疑(特别是它如何访问asciiArray[255] )。更重要的是,我看不出asciiArray[outer]如何小于0或许你的意思是>?。

答案 1 :(得分:3)

LIMIT应该设置为256,然后for循环应该

for(outer = 0; outer < LIMIT; outer++)

否则你要走出阵列。

正如其他人所提到的,应该初始化数组。

稍后在if语句中,它还检查该值是否小于零而不是大于。 它应该是:

if(asciiArray[outer] > 0)

并且第二个for语句是一个(假设你试图为每个角色的实例显示一个星)。它应该是:

for(inner = asciiArray[outer]; inner >= 1; inner--)

答案 2 :(得分:0)

您必须将ascii数组初始化为0;

i = 0;
while (i < LIMIT)
{
a[i] = 0;
i++;
}