在C语言中使用字符而非整数作为数组下标时会发生什么?
代码运行原理
- 第一步你定义了
int characters[126];,这是一个长度为126的整型数组,设计上是让数组下标直接对应输入字符的编码值,每个下标位置存储对应字符的出现次数。 - 循环部分的执行逻辑:
getchar()每次从标准输入读取一个字符,返回该字符对应的编码整数值赋值给变量a- 只要返回值不是EOF(EOF是标准库定义的文件结束标志,值为-1,代表输入流已经读取完毕),就进入循环体
- 循环体中将
characters[a]的数值加1,相当于把对应编码的字符计数加1
- 最后你遍历数组输出每个元素的值,就能得到每个字符的出现频率。
关于字符作为数组下标的问题
C语言本身不会规定字符对应的数值,这个数值是由系统采用的字符编码决定的,目前几乎所有主流系统都遵循ASCII编码规则:
- 可打印的ASCII字符取值范围是32~126,其中
'a'对应97、'b'对应98、'A'对应65、'0'对应48,所有字符都对应唯一的整数编码 - C语言中
char类型本质上是整型,字符常量会被自动转换为对应的编码整数值,所以完全可以直接作为数组下标使用。
你这段代码存在的问题
- 标准ASCII编码的取值范围是0~127,你定义的数组长度只有126,会导致编码为127的DEL控制符无法被存储统计,建议将数组长度改为128
- 你没有给数组做初始化,局部数组的初始值是随机内存垃圾值,会导致统计结果完全错误,建议定义时改为
int characters[128] = {0};,这样所有元素初始值都会被置为0 - 变量
a必须定义为int类型,不能定义为char类型:因为EOF的值为-1,如果你的系统中char是无符号类型,那么a永远不可能等于-1,会导致循环死锁。
内容的提问来源于stack exchange,提问作者Dr.Nykterstein
相关产品推荐
相关产品推荐

