C语言实现字符与单词统计:两个经典示例解析
本文将介绍如何在C语言中处理文本统计任务,重点展示如何分类统计各类字符(包括大小写字母、数字和符号)以及如何按长度统计单词出现的频率。这两个示例涵盖了C语言中字符判断、数组索引映射以及状态机逻辑的基础应用。
C语言字符分类统计
该程序旨在接收用户的键盘输入,直到用户按下回车键结束。程序会将输入的字符分为五类:0-9的数字、a-z的小写字母、A-Z的大写字母、空格以及其他未知字符。最终输出每一类的统计总数。
第1步:准备统计数组与环境
为了高效存储统计结果,程序定义了多个整型数组。由于ASCII码是连续的,可以直接将字符作为数组的下标。定义如下:
sz[10]:用于统计数字 '0' 到 '9'。zm[26]:用于统计小写英文字母 'a' 到 'z'。z[26]:用于统计大写英文字母 'A' 到 'Z'。
此外,初始化 space 计数器统计空格,e 计数器统记其他特殊字符。
第2步:读取字符并进行分类计数
程序使用 getchar() 函数逐个读取字符,并利用 while 循环直至遇到换行符 '\n'。在循环内部,通过一系列条件判断进行分类:
- 检测小写字母:若字符在 'a' 到 'z' 之间,将其偏移量
(c - 'a')作为zm数组的下标进行累加。 - 检测大写字母:若字符在 'A' 到 'Z' 之间,将其偏移量
(c - 'A')作为z数组的下标进行累加。 - 检测数字:若字符在 '0' 到 '9' 之间,将其偏移量
(c - '0')作为sz数组的下标进行累加。 - 检测空格与异常:如果是空格则
space++,否则归类为其他字符e++。
第3步:格式化输出统计结果
为了排版美观,程序使用了列数控制逻辑(通过变量 t 和取模运算 t % 3 == 0)来每输出三个数据后换行。分别打印了数字、小写字母和大写字母的统计详情,最后汇总输出空格和其他字符的数量。
#include <stdio.h>
int main()
{
// 初始化统计数组,sz存数字(10个),zm存小写字母(26个),z存大写字母(26个)
int sz[10]={0}, zm[26]={0}, z[26]={0}, i, space=0, e=0, t=0;
char c;
printf("请输入一段字符,统计其中各字符的数量\n");
// 逐字符读取直到回车
while((c=getchar())!='\n')
{
if(c<='z'&&c>='a')
zm[c-'a']++; // 小写'a'+x 映射到数组下标x
else if(c<='Z'&&c>='A')
z[c-'A']++; // 大写'A'+x 映射到数组下标x
else if(c<='9'&&c>='0')
sz[c-'0']++; // 数字'0'+x 映射到数组下标x
else if(c==' ')
space++; // 统计空格
else
e++; // 统计其他字符
}
printf("\n\n");
// 输出数字统计
for(i=0;i<=9;i++)
{
t++;
printf(" %d的个数为%d ",i,sz[i]);
if(t%3==0)printf("\n");
}
t=0;
printf("\n\n\n");
// 输出小写字母统计
for(i=0;i<=25;i++)
{
t++;
printf(" %c的个数为%d ",i+97,zm[i]);
if(t%3==0)printf("\n");
}
t=0;
printf("\n\n\n");
// 输出大写字母统计
for(i=0;i<=25;i++)
{
t++;
printf(" %c的个数为%d ",i+65,z[i]);
if(t%3==0)printf("\n");
}
printf("\n\n\n");
printf(" 空格的个数为%d\n\n",space);
printf(" 其他字符的个数为%d\n",e);
return 0;
}
统计不同长度的单词数量
此示例展示了更复杂的文本分析需求:统计文件中所有单词的长度分布,并记录超过最大预设长度的“超长单词”。该逻辑基于经典的有限状态机思想。
第1步:定义常量与全局变量
程序中引入了宏定义以增强可读性:
MAXWORD 30:限制关注的最大单词长度为30。IN 1/OUT 0:用于表示当前处于单词内还是单词外(遇到分隔符时切换状态)。
第2步:状态机逻辑核心
函数 wl() 是统计的核心。它不断读取字符并维护以下状态:
- 遇到分隔符(空格/换行/制表符):
- 此时状态变更为
OUT。 - 如果之前积累了字符数(
nc > 0),则根据累计长度nc更新对应的长度统计数组wl[nc]。 - 若长度超出限制(
nc >= MAXWORD),则增加溢出计数overflow。 - 重置当前计数字符数
nc = 0。
- 此时状态变更为
- 进入新单词(之前在单词外,现在遇到了非分隔符):
- 状态变为
IN,并将计数器nc设为 1。
- 状态变为
- 单词延续(当前在单词内):
nc++。
第3步:执行统计并输出
程序通过 while((c = getchar()) != EOF) 持续运行,直到文件结尾。循环结束后,遍历 wl 数组打印各个长度区间的单词数量。
#include <stdio.h>
#define MAXWORD 30 // 单词的最大长度
#define IN 1 // 在单词内,即没有遇到空格
#define OUT 0 // 在单词外,即遇到了空格
/*wl() -> Word Length*/
int wl()
{
char c;
int i;
int nc; // 当前正在统计的单词字符数
int state; // 单词的状态:IN或OUT
int overflow; // 长度超过MAXWORD的单词个数
int wl[MAXWORD]; // 长度为1~30的单词数量统计数组
state = OUT;
nc = 0;
overflow = 0;
// 初始化长度统计表
for(i = 1; i < MAXWORD; ++i)
wl[i] = 0;
// 逐词处理流直到文件结束
while((c = getchar()) != EOF)
if(c == ' ' || c == '\n' || c == '\t')
{
state = OUT;
if(nc > 0)
{
if(nc < MAXWORD)
++wl[nc]; // 长度在范围内,对应数组位置加1
else
++overflow; // 长度超出范围,溢出计数加1
}
nc = 0; // 重置当前单词长度计数
}
else if(state == OUT)
{
state = IN;
nc = 1; // 开始一个新的单词,长度为1
}
else
++nc; // 继续统计当前单词长度
// 输出统计结果
for(i = 1; i < MAXWORD; ++i)
printf("长度为:%d的单词个数为:%d : \n\n", i, wl[i]);
return 0;
}
main()
{
wl();
}
以上所述就是关于C语言统计字符个数及相关分析的详细内容,更多关于C语言基础开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









