#include "StringProcess.h"
//构造函数的实现
StringProcess::StringProcess(void)
{
}
//把一个字符串前面填充0,达到指定长度,例"abc"填6位->"000abc"
string StringProcess::modifyStr(string str,unsigned int a)
{
if(str.length()>=a)
return str;
return str.insert(0,a-str.length(),'0');
}
//数字符串中的某一个字符的个数
unsigned int StringProcess::countChar(string& strTarget,char c)
{
unsigned int count=0;
for (string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
if(*iter==c)
++count;
}
return count;
}
//在一个字符串里查找某个词出现的频度
unsigned int countWord(string& source,string& target)
{
if(source.find(target)==string::npos)
return 0;
unsigned int result(0),offset(0);
//一定存在子串
do
{
offset=source.find(target,offset)+1;
++result;
}
while((source.find(target,offset)!=string::npos));
return result;
}
//(deprecated!)切分字符串函数的实现
vector<string> StringProcess::split(string &strTarget,char spliter)
{
vector<string> vec(0);
//判断字符串是否为空
if(strTarget.empty())
return vec;
//首字母是分隔符的情况
if(strTarget[0]==spliter)
strTarget=strTarget.erase(0,1);
//尾字母是分隔符的情况
if(strTarget[strTarget.length()-1]==spliter)
strTarget=strTarget.erase(strTarget.length()-1,1);
if(strTarget.find(spliter,0)==string::npos)
{
vec.push_back(strTarget);
return vec;
}
unsigned int count=1+countChar(strTarget,spliter);
string::size_type startPos=0,offset=0;
//开始拆分并存入相应的字符串中
for (unsigned int i=0;i<count;i++)
{
offset=strTarget.find(spliter,startPos)-startPos;//最后一次循环时,offset会是个无意义的量,但是计算机会自动偏移回去(形式计算)
vec.push_back(strTarget.substr(startPos,offset));
startPos=startPos+offset+1;
}
//还要把最后一个放进容器中
//vec.push_back(strTarget.substr(startPos,strTarget.length()));
return vec;
}
//(重载,版本:2010-9-24)字符串切分函数,两个参数;前一个是要切分的字符串,后一个是切分的分隔符
vector<string> StringProcess::split(const string &strTarget, char spliter)
{
vector<string> vec(0);
if(strTarget.empty())
return vec;
string::size_type offset(0),startPos(0);
//开始拆分并存入相应的字符串中
do
{
offset=strTarget.find(spliter,startPos)-startPos;
if (offset == 0)
{
++startPos;
continue;
}
vec.push_back(strTarget.substr(startPos,offset));
startPos+=offset+1;
}
while (startPos);
return vec;
}
//(重载,版本:2010-9-24)字符串切分函数,三个参数;1是返回值,2是要切分的字符串,3是切分的分隔符
void StringProcess::split(vector<string> &buffer,string const &strTarget, char spliter)
{
buffer.clear();
if(strTarget.empty())
return ;
string::size_type offset(0),startPos(0);
//开始拆分并存入相应的字符串中
do
{
offset=strTarget.find(spliter,startPos)-startPos;
if (offset == 0)
{
++startPos;
continue;
}
buffer.push_back(strTarget.substr(startPos,offset));
startPos+=offset+1;
}
while (startPos);
}
//判断一个字符串中是否含有数字 D数字 U大写字母 S空白字符 L小写字母 P标点 C控制字符 X16进制数(特殊字符均指的是ASCii码)
bool StringProcess::hasSpecialChar(string& strTarget, char mark)
{
switch (mark)
{
//是否含有数字
case 'D':
for(string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
//遇到GB2312编码的字符(占两个字节),则不予以考虑
if(*iter<0)
{
++iter;
continue;//continue 还会执行一次++iter
}
if(isdigit(*iter))
return true;
}
return false;
//是否含有 大写字母
case 'U':
for(string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
//遇到GB2312编码的字符(占两个字节),则不予以考虑
if(*iter<0)
{
++iter;
continue;//continue 还会执行一次++iter
}
if(isupper(*iter))
return true;
}
return false;
//是否含有 空白字符
case 'S':
for(string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
//遇到GB2312编码的字符(占两个字节),则不予以考虑
if(*iter<0)
{
++iter;
continue;//continue 还会执行一次++iter
}
if(isspace(*iter))
return true;
}
return false;
//是否含有 小写字母
case 'L':
for(string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
//遇到GB2312编码的字符(占两个字节),则不予以考虑
if(*iter<0)
{
++iter;
continue;//continue 还会执行一次++iter
}
if(islower(*iter))
return true;
}
return false;
//是否含有 标点
case 'P':
for(string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
//遇到GB2312编码的字符(占两个字节),则不予以考虑
if(*iter<0)
{
++iter;
continue;//continue 还会执行一次++iter
}
if(ispunct(*iter))
return true;
}
return false;
//是否含有 控制字符
case 'C':
for(string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
//遇到GB2312编码的字符(占两个字节),则不予以考虑
if(*iter<0)
{
++iter;
continue;//continue 还会执行一次++iter
}
if(iscntrl(*iter))
return true;
}
return false;
//是否含有 16进制数
case 'X':
for(string::iterator iter=strTarget.begin();iter!=strTarget.end();++iter)
{
//遇到GB2312编码的字符(占两个字节),则不予以考虑
if(*iter<0)
{
++iter;
continue;//continue 还会执行一次++iter
}
if(isxdigit(*iter))
return true;
}
return false;
}
return false;
}
//专门用于在纯 汉语字符串中查找子串的函数
string::size_type StringProcess::findChineseSubstr(string& strTarget,string& mark)
{
string::size_type index=0;
while(true)
{
index=strTarget.find(mark,index);
//没找到
if(index==string::npos)
return string::npos;
//找到了,而且确实汉字的位置
if(index%2==0)
return index;
//找到了但不是汉字的位置,再从下一个位置开始找
++index;
}
return string::npos;
}
//在字符串中找到模式串(为宽字符的串)中的每个字符并将其替换为指定字符串。由于是双字节匹配,故存在错误的可能性,只是概率较小。
void StringProcess::relpaceChCh(string &source,string &pattern,string substitue)
{
int pos(-1);
for (unsigned int index(0);2*index < pattern.length();index++)
{
while( (pos=source.find(pattern.substr(2*index,2),pos+1)) != string::npos)
{
source.replace(pos,2,substitue);
}
//pos=-1//此句是多余的
}
}
//把一行字符串中分隔符后的数字提取出来,并转化成整型数字返回
int StringProcess::surfixToInt(string const &strLine,char spliter)
{
if(strLine.find(spliter) != string::npos)
return atoi(strLine.substr(strLine.find(spliter)+1).c_str());
return 0;
}
//把一个字符串里的大写英文字符都变成对应的小写的字母
void StringProcess::toLower(string &strSource)
{
for (string::iterator iter(strSource.begin());iter != strSource.end();++iter)
{
if (*iter>64 && *iter<91)
{
*iter+=32;
}
}
}
//有返回值的重在版本
string StringProcess::toLower(const std::string &strSource)
{
string strLower(strSource);
for (string::size_type index(0);index < strSource.length();++index)
{
if (strSource[index]>64 && strSource[index]<91)
{
strLower[index]+=32;
}
}
return strLower;
}
//把一个字符串里的小写英文字符都变成对应的大写的字母
void StringProcess::toUpper(string &strSource)
{
for (string::iterator iter(strSource.begin());iter != strSource.end();++iter)
{
if (*iter>96 && *iter<123)
{
*iter-=32;
}
}
}
//有返回值的重在版本
string StringProcess::toUpper(const std::string &strSource)
{
string strUpper(strSource);
for (string::size_type index(0);index < strSource.length();++index)
{
if (strSource[index]>96 && strSource[index]<123)
{
strUpper[index]-=32;
}
}
return strUpper;
}