C语言实现字符与单词统计:两个经典示例解析

Mia
Mia
发布时间:2026-10-13 | 4人浏览过
原创

本文将介绍如何在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'。在循环内部,通过一系列条件判断进行分类:

  1. 检测小写字母:若字符在 'a' 到 'z' 之间,将其偏移量 (c - 'a') 作为 zm 数组的下标进行累加。
  2. 检测大写字母:若字符在 'A' 到 'Z' 之间,将其偏移量 (c - 'A') 作为 z 数组的下标进行累加。
  3. 检测数字:若字符在 '0' 到 '9' 之间,将其偏移量 (c - '0') 作为 sz 数组的下标进行累加。
  4. 检测空格与异常:如果是空格则 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() 是统计的核心。它不断读取字符并维护以下状态:

  1. 遇到分隔符(空格/换行/制表符):
    • 此时状态变更为 OUT。
    • 如果之前积累了字符数(nc > 0),则根据累计长度 nc 更新对应的长度统计数组 wl[nc]。
    • 若长度超出限制(nc >= MAXWORD),则增加溢出计数 overflow。
    • 重置当前计数字符数 nc = 0。
  2. 进入新单词(之前在单词外,现在遇到了非分隔符):
    • 状态变为 IN,并将计数器 nc 设为 1。
  3. 单词延续(当前在单词内):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语言基础开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表