c++截取漢字和英文混合字符串代碼實(shí)例
在C++里截取字符串可以使用string.substr(),可是這個函數(shù)只能按英文來截取,
如果是漢字可能就要計(jì)算好字符個數(shù),如果是漢字和英文混合,那就只能望洋興嘆了。
可是恰好我需要這樣一個函數(shù),于是就自己實(shí)現(xiàn)了一個,其中如何判斷漢字和英文
參看了此處。
代碼簡單也無優(yōu)化,若有更好的方法歡迎提出,代碼如下。
#include <iostream>
#include <string>
#include<cstdio>
#include<vector>
#include<typeinfo>
using namespace std;
int is_zh_ch(char p)
{
/*漢字的兩個字節(jié)的最高為都為1,這里采用判斷最高位的方法
將p字節(jié)進(jìn)行移位運(yùn)算,右移8位,這樣,如果移位后是0,
則說明原來的字節(jié)最高位為0,不是1那么也就不是漢字的一個字節(jié)
*/
if(~(p >> 8) == 0)
{
return 1;//代表不是漢字
}
return -1;
}
string sub(string str,int start,int end=-1)
{
if(typeid(str)==typeid(string) && str.length()>0)
{
int len=str.length();
string tmp="";
//先把str里的漢字和英文分開
vector <string> dump;
int i=0;
while(i<len)
{
if (is_zh_ch(str.at(i))==1)
{
dump.push_back(str.substr(i,2));
i=i+2;
}
else
{
dump.push_back(str.substr(i,1));
i=i+1;
}
}
end=end>0?end:dump.size(); //end默認(rèn)為dump.size
if(start<0||start>end)
printf("start is wrong");
//直接從dump里取即可
for(i=start; i<=end; i++)
{
tmp+=dump[i-1];
}
return tmp;
}
else
{
printf("str is not string\n");
return "";
}
}
int main()
{
string p="半山wuji";
cout<<sub(p,1,1)<<endl;
cout<<sub(p,2,2)<<endl;
cout<<sub(p,3);
}
以上所述是小編給大家介紹的c++截取漢字英文混合字符串詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
C++ EasyX學(xué)習(xí)之鼠標(biāo)操作詳解
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將為大家詳細(xì)講講EasyX的鼠標(biāo)操作,需要的可以參考一下2022-07-07
C++超詳細(xì)講解貪心策略的設(shè)計(jì)及解決會場安排問題
為了更好的應(yīng)對《算法設(shè)計(jì)與分析》這門課程,我把書上以及老師講過的案例都詳細(xì)的做一個重現(xiàn)及解剖,讓你熟記每一個潛在的考點(diǎn),希望能給大家?guī)椭?/div> 2022-05-05
c語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡單實(shí)例
下面小編就為大家?guī)硪黄猚語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09
C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別
這篇文章主要介紹了C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-04-04最新評論

