我读了这个程序,但是我不能理解它。请解释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");
}
}
}
数组不存储任何字符(至少在概念上)。它存储了程序在索引c
的数组位置遇到数值为c
的字符的次数。
基本上,在C编程语言中,char
是一种由8位组成的数据类型,unsigned char
可以保存0到255的值,signed char
可以保存-128到127的值。
然后,程序定义一个足够大的数组,以容纳尽可能多的不同值,使用char
表示,每个唯一值对应一个数组位置。然后,它使用适当的数组位置length[c]
作为该特定值的计数器来计算出现的次数。当它循环遍历数组以打印数据时,它可以通过查看循环内的当前索引来判断数据属于哪个字符,因此printf("%c | ", x);
是字符,而length[x]
是我们要查找的数据。
在您的代码中,整数数组length[]
不用于存储字符。它仅用于存储键入的每个字符的计数。字符被一个接一个地读入字符变量c
while( (c = getchar() ) != EOL)
。
但棘手的部分是length[c]++;
。每个字符的计数保存在与其在数组length[]
中的ASCII value - 1
相等的位置。
例如在使用ASCII
码的系统中,length[64]
包含A
的计数,因为65
是A
的ASCII
码。
length[65]
包含B
的计数,因为66
是B
的ASCII-8
码。
length[96]
包含a
的计数,因为97
是a
的ASCII
码。
length[47]
包含0
的计数,因为48
是0
的ASCII
码。