C中的字符频率直方图

时间:2013-06-03 07:21:59

标签: c character histogram

我读了这个程序,但我无法理解它。请解释length[] arraay究竟发生了什么。它如何用于存储不同类型的字符,即数字和数字。 chars.Following是代码:

#include <stdio.h>
#define EOL '\n'
#define ARYLEN 256
main()
{
    int c, i, x;
    int length[ARYLEN];
    for(x = 0; x < ARYLEN;x++)
        length[x] = 0;
    while( (c = getchar() ) != EOL)
     {
        length[c]++;
    if (c == EOL)
        break;
    }    
    for(x = 0; x < ARYLEN; x++)
    {
         if( length[x] > 0){
            printf("%c | ", x);
            for(i = 1; i <= length[x]; ++i){
                printf("*");
         }
         printf("\n");
         }
     }
}

2 个答案:

答案 0 :(得分:2)

数组不存储任何字符(至少在概念上)。它存储程序在索引c的数组位置遇到具有数值c的字符的次数。

基本上,在C编程语言中,char是一个由8位组成的数据类型,能够保存unsigned char或-128到127的0到255范围内的值。 a signed char
然后,程序定义一个足够大的数组,以容纳尽可能多的不同值,使用char表示每个唯一值的一个数组位置。 然后,它使用适当的数组位置length[c]计算出现次数,作为该特定值的计数器。当它循环遍历数组以打印出数据时,它可以通过查看循环内的当前索引来判断数据属于哪个字符,因此printf("%c | ", x);是字符,而length[x]是数据我们正在追求。

答案 1 :(得分:1)

在您的代码中,整数数组length[]不用于存储字符。它仅用于存储键入的每个字符的计数。将字符逐个读入字符变量c while( (c = getchar() ) != EOL)

但棘手的部分是length[c]++;。每个字符的计数保持在与ASCII value - 1数组中的length[]相等的位置。

例如,在使用ASCII代码的系统中,length[64]包含A的计数,因为65ASCII的{​​{1}}代码}。

A包含length[65]的计数,因为B66的{​​{1}}代码。

ASCII-8包含B的计数,因为length[96]a的{​​{1}}代码。

97包含ASCII的计数,因为alength[47]的{​​{1}}代码。