简单易懂,上代码:

#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <vector>
using namespace std;class CStr{char *c;typedef struct {int start;bool isChinese;} counter;int cLen;vector<counter> cs;void calculate(){cLen = sizeof("你") - 1;int size = 0;for(int i = 0; i < getlen();){counter ic;ic.start = i;//根据第一个字符是否为负数判断是否为中文。。这个不知道是不是万金油,但是大多数情况应该可以应付。if(c[i] < 0){ic.isChinese = true;i += cLen;}else{ic.isChinese = false;i++;}cs.push_back(ic);}}
public:CStr(const char *cc){cout<<"构造"<<endl;c = new char[strlen(cc) + 1];strcpy(c, cc);calculate();}CStr(const CStr& s){//copycout<<"copy"<<endl;c = new char[s.getlen() + 1];strcpy(c, s.getstr());calculate();}const CStr& operator =(const CStr& s){cout<<"= operator"<<endl;if(&s == this) return s;cs.clear();delete []c;c = new char[s.getlen() +1];strcpy(c, s.getstr());calculate();return *this;}const char *getstr() const{return c;}int getlen() const{return strlen(c);}int getsize() const{return cs.size();}string substr(int start, int len) const{if(start + len > cs.size()){len = cs.size() - start;}int realStart = 0, realLen = 0;for(int j = 0; j < start;j++){if(cs[j].isChinese){realStart += cLen;}else{realStart += 1;}}for(int i = start; i < start + len; i++){if(cs[i].isChinese){realLen += cLen;}else{realLen += 1;}}return string(c).substr(realStart, realLen);}string get(int i)const{if(i > getsize()){cout<<"error in get "<<endl;return string("error");}const counter &cc = cs[i];char *r = NULL;int len = 0;if(cc.isChinese){r = new char[cLen + 1];len = cLen;}else{r = new char[2];len = 1;}memcpy(r, c + cc.start, len);r[len] = '\0';string rs = r;delete[]r;return rs;}void printBytes(const char *start, const char *end) const{//debugint i = 0;do{cout<<(int)*(start+i)<<"\t";}while(start+(++i) < end);cout<<endl;}void traversal() const {//debugfor(int i = 0; i < getsize(); i++){cout<<get(i)<<" ";//printBytes(get(i), get(i) + strlen(get(i)));}cout<<endl;}virtual ~CStr(){delete []c;}
};int main(){CStr str = "中所节快乐阿ajskd~123。1~。31kla加咖啡";str.traversal();cout<<"str.substr(2,3) = "<<str.substr(2,3)<<endl;CStr s1 = str;//copys1.traversal();cout<<"str.substr(2,4) ="<<str.substr(2,4)<<endl;s1 = str;// =s1.traversal();cout<<"str.substr(2,10) ="<<str.substr(2,10)<<endl;
}

带有中文的字符串各个字符的获取c++程序相关推荐

  1. java 汉字 字母_JAVA获取中文汉字字符串拼音首字母,英文字符不变的工具类

    java在处理项目需求时,有时需要排序,尤其是中文名字按0-9,A-Z进行首字母排序,这时候就需要首先要得到中文字符串的首字母,然后按照字母顺序进行排序,不多说,直接上代码,看java如何获取中文字符 ...

  2. 【转】SQL函数:字符串中提取数字,英文,中文,过滤重复字符

    SQL函数:字符串中提取数字,英文,中文,过滤重复字符 --提取数字 IF OBJECT_ID('DBO.GET_NUMBER') IS NOT NULL DROP FUNCTION DBO.GET_ ...

  3. UTF-8编码的字符串拆分成单字、获取UTF-8字符串的字符个数的代码及原理(c++实现)...

    一.字符编码简单介绍 1. ASCII码 在计算机内部,全部的信息终于都表示为一个二进制的字符串.每个二进制位(bit)有0和1两种状态,因此八个二进制位就能够组合出256种状态,这被称为一个字节(b ...

  4. c#获取带有汉字的字符串长度

    c#获取带有汉字的字符串长度 不知道大家注意没,用c#下自带的str.Length方法获得字符串str长度的时候,返回的总是字符的个数,但是如果字符串中包含汉字的话,一个汉字是占两个字符长度的,获取的 ...

  5. java字节字符_java按字节截取带有汉字的字符串的解法(推荐)

    由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串. 自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度 ...

  6. c++中string截取带有中文字符串的解决方案

    关于截取带有中文字符字符串问题  最近在做东西时候碰到了一个问题,当字符串中有中文,要截取固定长度的字符串,不能截取半截的字符串,在百度上也看了看,没有用c和c++实现的,几乎都是java,直接转一下 ...

  7. java截取中文_java按字节截取带有汉字的字符串的解法(推荐)

    由于接口使用的oracle字段长度为固定字节数,然后传进来的字符串估计比数据库字段的总字节数要大,那么截取小于数据库字节数的字符串. 自己参考网上的例子,整了个递归调用就可以了,因为截取的字符字节长度 ...

  8. python统计字符在文件中出现的次数_python字符串中字符出现次数(python获取字符串个数)...

    今天要说的是Python的字符串函数还是很方便的,只需要调用 count() 方法即可. 最近,我在一个网站上看到了一个自然语言处理课程.我详细解释了一些方法的使用,用例很容易理解,所以我想通过我的博 ...

  9. 判断字符串的长度,中文占两个字符

    刚看到以前写的js方法:计算字符串长度(中文算2个字符). 方法: var str = '123是是是'; var strArr = str.split(''); var count = 0; for ...

最新文章

  1. RichText设置高亮 (未完)
  2. golang 数据库null值错误 解决方法
  3. python笔记基础-Python基础知识
  4. apache-tomcat-6.0.39的配置
  5. MySQL(七):InnoDB 自适应Hash索引(Adaptive Hash Index)
  6. 用 toto 3分钟建轻量级博客
  7. React学习手记4-组件分类(受控组件和非受控组件)
  8. BCD与ASCII码互转-C语言实现
  9. 百度手机输入法中的五笔9键盘有问题?
  10. rds基于什么开发_玩物得志: 基于DataWorks+MaxCompute+MC-Hologres 构建大数据平台
  11. java中POJO类为什么要实现序列化
  12. 【黑灰产犯罪研究】网络水军
  13. SCP,NFS,TFTP的初步认识
  14. Scratch编程初体验-小猫跳舞
  15. mysql时间相减得到天数保留两位_[转]Mysql日期函数-日期相减返回天数
  16. RK3588 VOP-SPLIT分屏模式介绍
  17. 书小宅之android——聊天界面的实现
  18. jQuery实现BBS发贴操作
  19. 用AI培养孩子学习兴趣:讯飞新一代智能学习机发布
  20. 谷歌工具条PR更新和排名变化的迷思

热门文章

  1. WPF入门(三)-几何图形之不规则图形(PathGeometry) (2)
  2. maven工程插件配置
  3. 批处理+定时任务实现定时休息提醒
  4. 【tyvj1052】【树状dp】没有上司的舞会
  5. excel导入SQL脚本
  6. window.open和window.location.href的几种用法
  7. 异步调用WCF的方法需要小心的地方
  8. C#按关闭按钮实现最小化,按ESC才关闭的实现【含系统消息大全】
  9. VS2005 制作安装程序的一些网络教程
  10. 用Zend Stuido 的WSDL编辑器