2

我读了这个程序,但我无法理解它。请解释阵列中到底发生了length[]什么。它如何用于存储不同类型的字符,即数字和字符。以下是代码:

#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");
         }
     }
}
4

2 回答 2

2

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

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

于 2013-06-03T07:35:30.910 回答
1

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

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

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

length[65]包含 的计数B,因为66是 的ASCII-8代码B

length[96]包含 的计数a,因为97是 的ASCII代码a

length[47]包含 的计数0,因为48是 的ASCII代码0

于 2013-06-03T07:34:23.363 回答