当前位置: 首页 > news >正文

C语言项目:文本统计程序

C语言文本统计程序,功能如下:

  • 统计文本中 总字符数
  • 统计 英文字符数
  • 统计 中文字符数
  • 统计 空格数
  • 统计 标点符号数

为了兼容中文,需要使用 UTF-8编码 的中文字符(每个中文一般占 3 个字节),或者 GBK编码(每个中文占 2 个字节)。这里我给出 UTF-8版本

下面是示例代码(可统计中文、英文、空格和标点):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>int main() {FILE *fp;char filename[100];unsigned long total_chars = 0;unsigned long english_chars = 0;unsigned long chinese_chars = 0;unsigned long spaces = 0;unsigned long punctuation = 0;printf("请输入文本文件名: ");scanf("%s", filename);fp = fopen(filename, "r");if (!fp) {printf("无法打开文件 %s\n", filename);return 1;}int c;while ((c = fgetc(fp)) != EOF) {total_chars++;if (c <= 127) {// 英文字符、空格、标点if (isalpha(c)) english_chars++;else if (isspace(c)) spaces++;else punctuation++;} else {// 中文字符处理 (UTF-8一般3字节)chinese_chars++;// 跳过剩余字节if ((c & 0xE0) == 0xC0) fgetc(fp);       // 2字节中文else if ((c & 0xF0) == 0xE0) {           // 3字节中文fgetc(fp);fgetc(fp);} else if ((c & 0xF8) == 0xF0) {         // 4字节字符fgetc(fp);fgetc(fp);fgetc(fp);}}}fclose(fp);printf("\n===== 文本统计结果 =====\n");printf("总字符数: %lu\n", total_chars);printf("英文字符数: %lu\n", english_chars);printf("中文字符数: %lu\n", chinese_chars);printf("空格数: %lu\n", spaces);printf("标点符号数: %lu\n", punctuation);return 0;
}

⚙️ 使用说明

  1. 将程序保存为 text_stat.c
  2. 编译运行:
gcc -o text_stat text_stat.c
./text_stat
  1. 输入文本文件名,例如 test.txt
  2. 输出统计信息,包括中文、英文、空格和标点

1️⃣ UTF-8 编码基础

UTF-8 是变长编码,用 1~4 个字节表示一个字符:

字节数二进制模式范围
10xxxxxxxASCII 0~127
2110xxxxx 10xxxxxxU+0080~U+07FF
31110xxxx 10xxxxxx 10xxxxxxU+0800~U+FFFF
411110xxx 10xxxxxx 10xxxxxx 10xxxxxxU+10000~U+10FFFF
  • x 是字符的实际二进制位
  • 第一个字节的高位标记 字节长度,后续字节都以 10xxxxxx 开头

2️⃣ 为什么用 0xC0、0xE0、0xF0、0xF8

在代码里判断一个字符是几字节中文:

if ((c & 0xE0) == 0xC0)   // 2字节
if ((c & 0xF0) == 0xE0)   // 3字节
if ((c & 0xF8) == 0xF0)   // 4字节
  • 0xC0 = 11000000(二进制) → 判断是否是 2 字节字符
  • 0xE0 = 11100000(二进制) → 判断是否是 3 字节字符
  • 0xF0 = 11110000(二进制) → 判断是否是 4 字节字符
  • 0xF8 = 11111000(二进制) → 理论上 UTF-8 最多 4 字节,5~6 字节已废弃

逻辑解释:

(c & 0xF0) == 0xE0
  • c & 0xF0 → 取前 4 位
  • 3 字节中文的首字节前 4 位固定为 1110
  • 所以如果等于 0xE0(1110 0000),就是 3 字节中文

3️⃣ 总结记忆

UTF-8字节数首字节二进制十六进制注释
10xxxxxxx0x00~0x7FASCII
2110xxxxx0xC0~0xDF拉丁扩展
31110xxxx0xE0~0xEF常用中文
411110xxx0xF0~0xF7较生僻字符
5~6111110xx / 1111110x0xF8~0xFD已废弃

UTF-8 字节长度判定示意图

首字节范围二进制模式字节长度说明
0x00 ~ 0x7F0xxxxxxx1ASCII 英文字符
0xC0 ~ 0xDF110xxxxx2拉丁文/少量扩展
0xE0 ~ 0xEF1110xxxx3常用中文汉字
0xF0 ~ 0xF711110xxx4生僻汉字或表情
0xF8 ~ 0xFB111110xx5已废弃
0xFC ~ 0xFD1111110x6已废弃

UTF-8 多字节字符结构示意:

字节数首字节后续字节
10xxxxxxx-
2110xxxxx10xxxxxx
31110xxxx10xxxxxx 10xxxxxx
411110xxx10xxxxxx 10xxxxxx 10xxxxxx

示例:
1️⃣ 英文字符 ‘A’ → 0x41 → 1 字节
2️⃣ 中文 ‘你’ → 0xE4 0xBD 0xA0 → 3 字节
3️⃣ 表情 ‘😊’ → 0xF0 0x9F 0x98 0x8A → 4 字节


总结记忆法:

  • 0xxxxxxx → 1 字节:英文
  • 110xxxxx → 2 字节:少量扩展字符
  • 1110xxxx → 3 字节:常用中文
  • 11110xxx → 4 字节:生僻汉字或表情
    这些 0xC0、0xE0、0xF0 本质上是 UTF-8 首字节掩码,用来判断当前字节属于几字节字符,从而跳过剩余字节统计总字符数。
http://www.dtcms.com/a/478710.html

相关文章:

  • 龙游县建设局网站晋州建设规划局网站
  • Java-Spring入门指南(二十四)SSM整合HTML:解决CSS/JS静态资源被过滤问题
  • 安阳做网站多少钱邢台最新通告今天
  • 如何做高并发网站的架构设计地方型旅游网站
  • 网站文章伪原创怎么做网站建设策划基本流程图
  • 条件概率、全概率、贝叶斯
  • 用mvc做网站报告自己的电脑做服务器搭建网站
  • 更换网站模板html所有标签大全
  • 软件模拟存储,SCSI映射StarWind5.4 企业版
  • DFS和BFS算法和回溯算法
  • c++ 标准模板库练习
  • 购物网站建设费用wordpress调用python脚本
  • 基于深度学习的数字图像分类实验与分析
  • 图像视觉——颜色识别
  • 扬州网站建设哪家公司好电商运营适合女生吗
  • HTML应用指南:利用POST请求获取全国兴业银行网点位置信息
  • Excel处理控件Aspose.Cells教程:使用 Python 将 HTML 转换为 Excel
  • 菏泽做网站的公司可玩儿小程序可以加盟么
  • 阿里云发布《AI 原生应用架构白皮书》
  • 如何在百度上注册自己的网站做网站运营有提成吗
  • 分布式数据库架构:从分库分表到NewSQL实战
  • Java的双重检查锁机制(DCL)与懒加载的单例模式
  • Qt代码-QVector向量数组的增删改查插入统计复制
  • 深圳建设门户网站博客wordpress
  • 免费做网站的好不好大理悦花轩客栈在哪些网站做推广
  • 语义与认知中的循环解释悖论及其对人工智能自然语言处理深层语义分析的影响与启示
  • 购物类网站百度关键词搜索排名
  • 微信公众号的跳转网站怎么做外贸网站要先备案吗
  • 【VSCode+WSL】开发环境随身携带:我的VSCode+cpolar远程工作站实战
  • 长沙做最好网站东营建设信息网的网址