C语言C++ 字符串处理函数集合更新.docx
《C语言C++ 字符串处理函数集合更新.docx》由会员分享,可在线阅读,更多相关《C语言C++ 字符串处理函数集合更新.docx(41页珍藏版)》请在冰豆网上搜索。
C语言C++字符串处理函数集合更新
#include
#defineANum1285
#defineANum23500
//printf("%d%c\n",(int)'a',(char)123);//字符查看ASCⅡ表
//printf("%d%d\n",(int)"我"[0],(int)"我"[1]);//汉字查看ASCⅡ表
//《构造函数部分》
//Small_Num求较小函数求两个整型数据中较小的一个,返回值为较小的数
intSmall_Num(intNum1,intNum2)
{
if(Num1>Num2)
returnNum2;
else
returnNum1;
}
//Bige_Num求较大函数求两个整型数据中较大的一个,返回值为较大的数
intBige_Num(intNum1,intNum2)
{
if(Num1>Num2)
returnNum1;
else
returnNum2;
}
//Str_Len求字符串求长函数求任意长度字符串或指针指向的字符串的字符串长度,返回值为字符数加1(即字符串长度)
intStr_Len(charStr2[])
{
inti=0;
while(Str2[i]!
=0)//求长原理字符串最后以0结尾,统计不为0,直到为0时即可
i++;
returni+1;
}
//Arr_Len求字符串数组元素个数的函数,返回值为字符串数
intArr_Len(charStr2[][ANum1])//求元素个数要求数组中不能含有空串,该函数只统计到出现空串为止,另外数组的外层参数ANum1必须给出且与数组相同
{
inti=0;
while(Str2[i][0]!
=0)//求长原理字符串第一位不为0,统计不为0,直到为0时即可
i++;
returni-1;
}
//char->int转换,s[]为待转换成数字的数字字符串,一个参数时将s[]转换成十进制数,Str_Len为数字位数
intChar_Int(chars[])
{
intTotal=0;
for(inti=0;i{
intTmp=s[i]-48;//Tmp用于存储字符串各个字节处转换后的的数字s[i]-48,转换前该字节处用s[i]表示该数字字符
Total=Total*10+Tmp;//将各位数字字合成字符所表示的数据
}
returnTotal;//返回数字处理后得到的数字
}
//char->int转换,s[]为待转换成数字的数字字符串,两个参数时将s[]转换成Num进制数并以十进制输出,Str_Len为数字位数
intChar_Int(chars[],intNum)
{
intTotal=0;
for(inti=0;i{
intTmp=s[i]-48;//Tmp用于存储字符串各个字节处转换后的的数字s[i]-48,转换前该字节处用s[i]表示该数字字符
Total=Total*Num+Tmp;//将各位数字字合成字符所表示的数据
}
returnTotal;//返回数字处理后得到的数字
}
//int->char转换,chars[]为有足够长度的字符串,用于存储数字生成的字符串
char*Int_Char(intn,chars[])
{
intTmp_n=n,Length=0;
while(Tmp_n>=1)//求出待转换成字符的数字的长度Length
{
Length++;
Tmp_n/=10;//依次除10直到小于1退出循环
}
for(inti=0;i{
Tmp_n=n%10;//对待转换的数字各位依次取余数,存入Tmp_n中
n/=10;//对待转换的数字依次去尾数,以便下一次取余数
s[Length-1-i]=Tmp_n+48;//将各位数字依次转换成对应数字字符所对应的数字(即Tmp_n+48),再存入字符串的相应位置(即s[Length-1-i]
}
s[Length]=0;//位数字字符串设尾
returns;//返回生成的数字字符串
}
//Str_Cpy字符串拷贝函数,将字符串从源字符串Str2拷贝到目标字符串Str1,返回值Str1所对应的字符串
char*Str_Cpy(charStr1[],constcharStr2[])
{
inti=0;
while(Str2[i]!
=0)
{
Str1[i]=Str2[i];
i++;
}
Str1[i]=0;
returnStr1;
}
//Str_Cpy字符串拷贝函数,从源字符串Str1中拷贝前Num个字符串Str2中,返回值Str2所对应的字符串
char*Str_Cpy(constcharStr1[],intNum,charStr2[])
{
inti=0;
while(Str1[i]!
=0&&i{
Str2[i]=Str1[i];
i++;
}
Str2[i]=0;
returnStr2;
}
//Str_Cpy字符串拷贝函数,从Str1第Num1个字符的位置开始,拷贝Num2个字符到Str2中,返回值Str2所对应的字符串
char*Str_Cpy(constcharStr1[],intNum1,intNum2,charStr2[])
{
inti=0;
while(Str1[i]!
=0&&i{
Str2[i]=Str1[i+Num1-1];
i++;
}
Str2[i]=0;
returnStr2;
}
//使得Str的长度变为Len的整数倍不足部分添加空格
char*Str_Chg(charStr[],intLen)
{
inti,LenS=Str_Len(Str);
if((LenS%Len)!
=0)//对字符串进行处理使得Str的长度为Len的整数倍
{
for(i=LenS-1;i<((LenS/Len+1)*Len)-1;i++)
Str[i]='';
Str[i]=0;
}
returnStr;
}
//字符串str2加空格添加函数,添加至str1的尾部
char*str_add(charstr1[],charstr2[])
{
inti=0,j=0;
while(str1[i]!
=0)i++;//当str1到达尾部时
str1[i++]='';//将结尾改为空格
while(str2[j]!
=0)//并将str2非结尾部分添加至str1后
{
str1[i]=str2[j];
i++;
j++;
}
str1[i]=0;//为str1添加结尾
returnstr1;
}
//Str_Add将字符串Str2添加到字符串Str1的尾部
char*Str_Add(charStr1[],charStr2[])//须包含Str_Len求字符串长函数,需给Str1分配内存空间,例:
charstr[50]="apple";Str_Add(str,"banana"));
{
intNum=Str_Len(Str1)-1;
for(inti=Str_Len(Str1);i>Num;i--)
Str1[(i-1)+(Str_Len(Str2)-1)]=Str1[i-1];//将字符串1的第i-1个字符向后移动字符串Str2个字符数
for(i=0;iStr1[Num+i]=Str2[i];
returnStr1;
}
//Str_Add将字符串Str2添加到字符串Str1从左向右(0123……)第Num处,Num=0时添加到第一个字符串前,
//Num=StrLen(Str1)-1添加到第一个字符串末尾,倒数第四个位置为StrLen(Str1)-5
char*Str_Add(charStr1[],intNum,charStr2[])
{
for(inti=Str_Len(Str1);i>Num;i--)//须包含Str_Len求字符串长函数
Str1[(i-1)+(Str_Len(Str2)-1)]=Str1[i-1];//将字符串1的第i-1个字符向后移动字符串Str2个字符数
for(i=0;iStr1[Num+i]=Str2[i];
returnStr1;
}
//Str_Cmp_Min字符串比较函数(按字母表的顺序)比较两个字符串的大小,输出较小的字符串对应的数字
//返回值1表示字符串Str1较小;返回值2字符串Str1较小;返回0时两个字符串相同
intStr_Cmp_Min(charStr1[],charStr2[])//需包含构造函数Small_Num、Str_Len
{
intCM_i=Small_Num(Str_Len(Str1),Str_Len(Str2));//取较短的字符串长度进行比较,(即比较至字符长度的后一位
for(inti=0;iCirculateMaxNumberi
{
if(Str1[i]==Str2[i])//如果字符串的第一个字符相同
i++;//则跳过上一个字符
if(Str1[i]>Str2[i])//比较字符串的第二个字符
{
return2;
i=CM_i-1;
}
if(Str1[i]{
return1;
i=CM_i-1;
}
}
return0;//有返回的值函数return0必需为最外层返回才有效
}
//判断str2是否是str1的子串,str2必须从str1的第一位开始
intstr_inc(charstr1[],charstr2[])
{
inti=0;
while(str2[i]!
=0)//当str2未至结尾时
{
if(str2[i]!
=str1[i])return0;//当两字符串对应字符不相同时,返回0
if(str2[++i]==0)return1;//当str2至结尾时,返回1
}
return0;
}
//Str_Inc两个参数的stringinclude函数用于判断字符串Str1中是否含有字符串Str2,包含几个返回值就为几,返回CountS2的值
intStr_Inc(charStr1[],charStr2[])//需包含构造函数Str_Len
{
intCountL,CountS2=0;//CountL用于统计字符串长度是否达到Str2的长度,CountS2用于计数与Str2相同的字符串个数
for(inti=0;i{
intk=i;
if(Str1[i]==Str2[0])//当第一个字符串相同时开始进一步比较剩下几位是否相同
{
CountL=1;
for(intj=1;jif(Str1[++k]==Str2[j])
CountL++;
}
else
CountL=0;//对CountL进行清零操作避免CountS2统计出错
if(CountL==Str_Len(Str2)-1)//当剩下几位也相同时即含有与Str2相同的部分
CountS2++;//统计个数
}
returnCountS2;
}
//Str_Inc_NoDif不区分大小写的字符比较函数两个参数的stringinclude函数用于判断字符串Str1中是否含有字符串Str2,包含几个返回值就为几,返回CountS2的值
intStr_Inc_NoDif(charStr1[],charStr2[])//需包含构造函数Str_Len
{
charTmp1[ANum1],Tmp2[ANum1];
Str_Cpy(Tmp1,Str1);
Str_Cpy(Tmp2,Str2);
intCountL,CountS2=0;//CountL用于统计字符串长度是否达到Str2的长度,CountS2用于计数与Str2相同的字符串个数
for(inti=0;i{
intk=i,j;
if(Tmp1[i]<97)Tmp1[i]+=32;//不区分大小写时,将大写全部转换成小写,进行比较
if(Tmp2[0]<97)Tmp2[0]+=32;
if(Tmp1[i]==Tmp2[0])//当第一个字符串相同时开始进一步比较剩下几位是否相同
{
CountL=1;
for(j=1;jif(Tmp1[++k]==Tmp2[j])
{
if(Tmp1[k]<97)Tmp1[k]+=32;
if(Tmp2[j]<97)Tmp2[j]+=32;
CountL++;
}
}
else
CountL=0;//对CountL进行清零操作避免CountS2统计出错
if(CountL==Str_Len(Tmp2)-1)//当剩下几位也相同时即含有与Str2相同的部分
CountS2++;//统计个数
}
returnCountS2;
}
//Str_Inc三个参数的stringIclude函数用于将字符串Str1中第Num个Str2是字符的起始位置i作为返回值返回,当Str1中不含有Str2时,i的返回值为Str1的字符串长度
intStr_Inc(charStr1[],intNum,charStr2[])//需包含构造函数Str_Len
{
inti,CountL,CountS2=0;//CountL用于统计字符串长度是否达到Str2的长度,CountS2用于计数与Str2相同的字符串个数
for(i=0;i{
if(Str1[i]==Str2[0])//当第一个字符串相同时开始进一步比较剩下几位是否相同
{
intk=i;
CountL=1;
for(intj=1;jif(Str1[++k]==Str2[j])
CountL++;
}
else
CountL=0;//对CountL进行清零操作避免CountS2统计出错
if(CountL==Str_Len(Str2)-1)//当剩下几位也相同时即含有与Str2相同的部分
CountS2++;//统计个数
if(CountS2==Num)
returni;//返回第Num个Str2处起始处i的值
}
returnStr_Len(Str1);
}
//Str_Son,求字符串数组最小子字符串函数,数组的最内层下标可以省略str1[][ANum1],其余参数必须补齐且与待处理数组相同
//将字符串数组str1中的子串存入数组str2中对应的位置
voidStr_Son(charstr1[][ANum1],charstr2[][ANum1])//需包含构造函数Arr_Len、Str_Len、三个参数Str_Cpy、三个参数的Str_Inc
{
inttotal=Arr_Len(str1);
for(inti=0;i{
for(intj=0;j{
intinclude=0;
Str_Cpy(str1[i],j+1,str2[i]);//将子字符串拷贝到str2[i]中
for(inti2=0;i2{
if(i2!
=i&&Str_Inc(str1[i2],1,str2[i])==0)//当str2[i2]与str2[i]不是同一个字符串,且str1[i2]开始的位置就含有子字符串str2[i]时,计数变量include自加
include++;
}
if(include==0)j=Str_Len(str1[i]-1);//没有与子字符串相同时退出循环
}
}
}
//将字符串str2从str1的第一位开始清除
char*str_del(charstr1[],charstr2[])
{
if(str_inc(str1,str2)==0)returnstr1;//判断str2是否为str1的子串,若不是直接返回str1不删除
inti=0,j=0;
while(str2[i]!
=0)i++;//当str2未至结尾时
while(str1[i-1]!
=0)//当str2未至结尾str1还未至结尾时
{
str1[j]=str1[i];//将str1的后str2位从开始位置开始复制
j++;
i++;
}
str1[j]=0;//为str2加上结尾
returnstr1;
}
//Str_DelStringdelit函数用于将字符串Str1中的第Num个Str2字符串删除
char*Str_Del(charStr1[],intNum,charStr2[])//需包含构造函数Str_Len、Str_Inc、
{//当Str1中没有Str时最大循环数CM_j<0,j初值为0且j++,jinti=Str_Inc(Str1,Num,Str2);//通过三个参数的stringIclude获取第Num个Str2在字符串str1字符串的起始位置i
intCM_j=Str_Len(Str1)-(Str_Len(Str2)-1)-i;//求循环操作长度
for(intj=0;jStr1[i++]=Str1[i+(Str_Len(Str2)-1)];//将Str1中第Num个Str2后的字符串移至起始位置i覆盖原有数据
returnStr1;//输出Str1注意!
在引用函数Str_Del时,Str1必须有属于自己的内存空间,如:
Str_Del("apple",1,"pp")时,系统就
}
//Str_DelStringdelit函数用于删除字符串Str1中的所有Str2
char*Str_Del(charStr1[],charStr2[])//需包含构造函数Str_Len、两参数的Str_Inc、三参数的Str_Del
{
intcount=Str_Inc(Str1,Str2);//统计开始时Str2含有多少个Str1
while(count--!
=0)
Str_Del(Str1,1,Str2);
returnStr1;
}
//Str_Rep四个参数的StringRplace函数用一个字符串Str3去取代字符串Str1中的第Num个字符串Str2
char*Str_Rep(charStr1[],charStr2[],intNum,charStr3[])//需包含构造函数Str_Inc、Str_Del、Str_Add
//取代时Str1须有自己的内存空间才能写入,还需有足够容纳取代后总字符的
{//空间否则会发生数组越界可能会导致部分信息丢失
inti=Str_Inc(Str1,Num,Str2);//用i记住第Num个Str2在Str1的起始位置
Str_Del(Str1,Num,Str2);//删除Str1中第N