You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言字母统计代码疑问:字符比较逻辑及数组计数操作原理

代码逻辑疑问解答

1. 初始c=0的判断逻辑

你问:初始时c的值为0,而ASCII码中'a'对应的十进制值为97,是否初始状态下所有if判断条件都不会成立?
这个判断是正确的。C语言中字符常量本质是对应ASCII码的整数值,初始c=0时:

  • 既不满足小写字母区间c >= 'a' && c <= 'z'(对应ASCII值97~122)
  • 也不满足大写字母区间c >= 'A' && c <= 'Z'(对应ASCII值65~90)
  • 也不等于换行符'\n'(对应ASCII值10)
    所以第一次执行循环体时会直接进入else分支,给统计其他字符的A[26]额外加1,这属于当前代码的逻辑小瑕疵,原因是do-while会先执行循环体,再执行while条件里的fgetc读取字符赋值给c,第一次循环用的是初始的无效值0。

2. 字符与'a'比较的运行逻辑

c >= 'a' && c <= 'z'这行代码的作用是判断当前读取到的字符是否为小写字母:

  • 程序运行到后续循环时,c已经被while ((c = fgetc(data1)) != EOF)赋值为从文件读取到的字符的ASCII值
  • 直接用c和字符常量'a'、'z'比较,本质就是判断c的整数值是否落在小写字母对应的ASCII区间内,写法比直接写97、122可读性更强。

3. A[c]++的功能

你定义的int A[27] = {0}是计数数组,每个元素的作用如下:

  • A[0]`A[25]`:分别对应字母az的出现次数
  • A[26]:统计非字母、非换行的其他字符的出现次数
    当判断c是小写字母时,执行c -= 'a':比如当前字符是'a'(ASCII值97),减'a'后得到0,就对应A[0],执行A[c]++就是把a的计数加1;如果字符是'z'(ASCII值122),减'a'后得到25,对应A[25],即z的计数加1。
    大写字母的逻辑同理,c -= 'A'后同样得到0~25的下标,大小写字母会统一计数到同一个数组下标中。

内容的提问来源于stack exchange,提问作者skruf922

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:36:04