【C++】统计字符串中文、英文字母、空格、数字和其他字符的个数 / 判断中文字符(GBK)

写在前面

本文针对GBK编码进行编程,可以右键控制台选择属性查看。

若是UTF-8或其他编码,可以查询相对应的编码表,参考本文思路进行编程。

在这里插入图片描述

判断中文字符

  • 首先,我们要知道输入一个中文字符,如果是GBK编码,那么要用两字节进行存储,如果拿string进行存储,那么字符串长度其实为2s[0]是高字节而s[1]是低字节(此处涉及到内存存储,请参考大小端模式)。
  • 有了前置知识就好办了,我们判断中文字符的阻碍其实就是中文字符存储字节数的不确定每个字节存储范围的不确定。如果我们能知道编码是什么,那么上面两个问题就都解决了。
  • 搜索资料可知GBK编码范围为0x8140到0xFEFE(这个0x其实是16进制表示的意思,两个十六进制位,就是8位也就是一个字节)。说人话:用16进制表示的话,高字节范围从81FE,低字节范围从40FE,若不符合则不是GBK中文字符。

参考代码

这个编程风格是为了缩格演示思路,并不规范,请见谅。。。

#include <iostream>
#include <map>

using namespace std;

int main(){
    cout<<"请输入字符串:"<<endl;
    string s;
    getline(cin, s);	//获取一行输入

    map<string, int> cnt;	//用于统计
    for (int i=0; i<s.length(); i++) {
        if ((s[i]>='a'&&s[i]<='z') || (s[i]>='A'&&s[i]<='Z'))
            cnt["英文字母"]++;
        else if (s[i]>='0' && s[i]<='9')
            cnt["数字"]++;
        else if (s[i] == ' ')
            cnt["空格"]++;
        else if(i+1<s.length() &&       //防止越界
                ((unsigned char)s[i]>=0x81&&(unsigned char)s[i]<=0xFE&&         //高位
                 (unsigned char)s[i+1]>=0x40&&(unsigned char)s[i+1]<=0xFE)){    //低位
            //使用unsigned char是因为unsigned不会变成负值,这样方便判断
            cnt["中文字符"]++;
            i++;
        } else
            cnt["其它字符"]++;
    }
    
    for (map<string, int>::iterator it = cnt.begin(); it!=cnt.end(); it++) {
        printf("%s个数:%d\n", (it->first).c_str(), it->second);
    }

    return 0;
}
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值