c语言字符串处理器,c语言中字符串操作的工具类



1.编写头文件

#define_CRT_SECURE_NO_WARNINGS

//#pragmawarning(disable:4996)

#include

#include

#include

structCString

{

char*p;//保存字符串首地址

intreallength;//实际长度

};

typedefstructCStringmystring;//简写

//原封不动初始化

voidinit(mystring*string);

//开辟长度,内存清零

voidinitwithlength(mystring*string,intlength);

//初始化并拷贝字符串

voidinitwithstring(mystring*string,char*copystring);

//打印

voidprintfstring(mystring*string);

//增加字符

voidbackaddchar(mystring*string,charch);

//增加字符串

voidbackaddstring(mystring*string,char*str);

//执行指令

voidrun(mystring*string);

//返回第一个找到的字符的地址

char*findfirstchar(mystring*string,charch);

//返回第一个找到的字符串的地址

char*findfirststring(mystring*string,char*str);

//删除第一个找到的字符

intdeletefirstchar(mystring*string,constcharch);

//删除第一个找到的字符串

intdeletefirststring(mystring*string,char*conststr);

//任意增加字符

voidaddchar(mystring*string,charch,char*pos);

//任意增加字符串

voidaddstring(mystring*string,char*str,char*pos);

//改变字符

voidchangefirstchar(mystring*string,constcharoldchar,constcharnewchar);

//改变字符串

voidchangefirststring(mystring*string,char*constoldstring,char*constnewstring);

2.编写函数实现

#include"mystring.h"

#include"stdio.h"

#include"stdlib.h"

/*求字符串的长度*/

intmystrlen(char*p)

{

if(p==NULL)

{

return-1;//失败,

}

intlength= 0;

while(*p!='\0')//字符串终止条件

{

length++;//长度自增

p++;//指针不断向前

}

returnlength;

}

/*字符串拷贝*/

char*mystrcpy(char*dest,constchar*source)//const限定不被意外修改

{

if(dest==NULL||source==NULL)

{

returnNULL;//为空没有必要干活了

}

char*destbak=dest;

while(*source!='\0')//一直拷贝

{

*dest= *source;//赋值字符

source++;

dest++;//指针不断向前,字符挨个赋值

}

*dest='\0';//结尾

returndestbak;//返回地址

}

/*字符串拼接*/

char*mystrcat(char*dest,constchar*source)

{

if(dest==NULL||source==NULL)

{

returnNULL;//失败

}

else

{

char*destbak=dest;//保留地址

while(*dest!='\0')

{

dest++;//指针向前移动

}

//从尾部开始拷贝

while(*source!='\0')//循环被被拷贝的字符串

{

*dest= *source;//字符串赋值

dest++;

source++;

}

*dest='\0';//结尾

returndestbak;

}

}

char*mystrchr(constchar*dest,constcharch)

{

if(dest==NULL)

{

returnNULL;

}

while(*dest!='\0')

{

if(*dest==ch)

{

returndest;//找到返回地址

}

dest++;

}

returnNULL;//返回

}

char*mystrstr(constchar*constdest,constchar*constfindstr)

{

if(dest==NULL||findstr==NULL)

{

returnNULL;

}

char*destbak=dest;

char*p=NULL;//保存找到的地址

while(*destbak!='\0')

{

intflag= 1;//假定是相等

char*findstrbak=findstr;

char*nowdestbak=destbak;

while(*findstrbak!='\0')

{

if(*nowdestbak!='\0')

{

if(*findstrbak!= *nowdestbak)//有一个不等

{

flag= 0;//赋值为0代表不等

}

nowdestbak++;

findstrbak++;

}

else

{

flag= 0;//设置标识

break;

}

}

if(flag== 1)

{

p=destbak;//当前位置

returnp;

}

destbak++;

}

returnNULL;

}

voidinit(mystring*string)

{

string->p=NULL;

string->reallength= 0;//初始化结构体字符串

}

voidinitwithlength(mystring*string,intlength)

{

//string->p =(char *) malloc(sizeof(char)*length);//分配内存

string->p= (char*)calloc(length,sizeof(char));//分配内存并清零

string->reallength=length;//长度

}

voidinitwithstring(mystring*string,char*copystring)

{

intlength=strlen(copystring);//获取字符串长度

string->p= (char*)calloc(length+ 1,sizeof(char));//分配内存

mystrcpy(string->p,copystring);//拷贝字符串

string->reallength=length+ 1;//设置长度

}

voidbackaddchar(mystring*string,charch)

{

if(mystrlen(string->p) + 1 ==string->reallength)//意味着满了

{

//重新分配内存

string->p=realloc(string->p,string->reallength+ 1);

string->reallength+= 1;

string->p[string->reallength- 2] =ch;

string->p[string->reallength- 1] ='\0';

}

else

{

intnowlength=mystrlen(string->p);//求出当前长度

string->p[nowlength] =ch;

string->p[nowlength+ 1] ='\0';//字符的增加

}

}

voidbackaddstring(mystring*string,char*str)

{

intnowmystringlength=mystrlen(string->p);//获取当前长度

intaddstringlength=mystrlen(str);//要增加的长度

if(nowmystringlength+addstringlength+ 1 >string->reallength)//判定是否越界

{

intneedaddlength=nowmystringlength+addstringlength+ 1 - (string->reallength);

//printf("%d",needaddlength);

string->p= (char*)realloc(string->p,string->reallength+needaddlength);//增加字符串长度

mystrcat(string->p,str);//拷贝字符串

string->reallength+=needaddlength;//增加长度

}

else

{

mystrcat(string->p,str);//拷贝字符串

}

}

voidprintfstring(mystring*string)

{

printf("\nstring=%s",string->p);//打印字符串

}

voidrun(mystring*string)

{

system(string->p);//执行指令

}

char*findfirstchar(mystring*string,charch)

{

char*p=mystrchr(string->p,ch);//查找

returnp;

}

char*findfirststring(mystring*string,char*str)

{

char*pres=mystrstr(string->p,str);

returnpres;//返回地址

}

intdeletefirstchar(mystring*string,constcharch)

{

char*p=mystrchr(string->p,ch);//查找

if(p==NULL)

{

return0;

}

else

{

char*pnext=p+ 1;

while(*pnext!='\0')

{

*p= *pnext;//删除一个字符整体向前移动

p++;

pnext++;

}

*p='\0';//字符串要有结尾

return1;

}

}

intdeletefirststring(mystring*string,char*conststr)

{

char*pres=mystrstr(string->p,str);//查找

if(pres==NULL)

{

return0;

}

else

{

intlength=mystrlen(str);//求字符串长度

char*pnext=pres+length;//下一个字符

while(*pnext!='\0')

{

*pres= *pnext;//删除一个字符整体向前移动

pres++;

pnext++;

}

*pres='\0';//字符串要有结尾

return1;

}

}

voidaddchar(mystring*string,charch,char*pos)

{

if(pos==NULL||string==NULL)

{

return;

}

if(mystrlen(string->p) + 1 ==string->reallength)//意味着满了

{

//重新分配内存

string->p=realloc(string->p,string->reallength+ 1);

string->reallength+= 1;

intnowlength=mystrlen(string->p);//求出当前长度

intmovelength=mystrlen(pos);//求出现在要移动的长度

for(inti=nowlength;i>nowlength-movelength;i--)//移动

{

string->p[i] =string->p[i- 1];//轮询

}

string->p[nowlength-movelength] =ch;//插入

string->p[nowlength+ 1] ='\0';//结尾

}

else

{

intnowlength=mystrlen(string->p);//求出当前长度

intmovelength=mystrlen(pos);//求出现在要移动的长度

for(inti=nowlength;i>nowlength-movelength;i--)//移动

{

string->p[i] =string->p[i- 1];//轮询

}

string->p[nowlength-movelength] =ch;//插入

string->p[nowlength+ 1] ='\0';//结尾

}

}

voidaddstring(mystring*string,char*str,char*pos)//任意增加字符串

{

if(pos==NULL||string==NULL)

{

return;

}

intnowmystringlength=mystrlen(string->p);//获取当前长度

intaddstringlength=mystrlen(str);//要增加的长度

if(nowmystringlength+addstringlength+ 1 >string->reallength)//判定是否越界

{

intneedaddlength=nowmystringlength+addstringlength+ 1 - (string->reallength);

//printf("%d",needaddlength);

string->p= (char*)realloc(string->p,string->reallength+needaddlength);//增加字符串长度

string->reallength+=needaddlength;//增加长度

//先移动,再拷贝

intnowlength=mystrlen(string->p);//求出当前长度

intmovelength=mystrlen(pos);//求出现在要移动的长度

intinsertlength=strlen(str);//要求出插入的长度

for(inti=nowlength;i>=nowlength-movelength;i--)

{

string->p[i+insertlength] =string->p[i];//字符移动

}

for(intj= 0;j

{

string->p[nowlength-movelength+j] =str[j];//赋值拷贝

}

}

else

{

intnowlength=mystrlen(string->p);//求出当前长度

intmovelength=mystrlen(pos);//求出现在要移动的长度

intinsertlength=strlen(str);//要求出插入的长度

for(inti=nowlength;i>=nowlength-movelength;i--)

{

string->p[i+insertlength] =string->p[i];//字符移动

}

for(intj= 0;j

{

string->p[nowlength-movelength+j] =str[j];//赋值拷贝

}

}

}

voidchangefirstchar(mystring*string,constcharoldchar,constnewchar)//改变字符

{

char*pstr=string->p;

while(*pstr!='\0')

{

if(*pstr==oldchar)//查找

{

*pstr=newchar;//赋值

return;

}

pstr++;

}

}

voidchangefirststring(mystring*string,char*constoldstring,char*constnewstring)//改变字符串

{

char*pfind=findfirststring(string,oldstring);//找到位置

if(pfind!=NULL)

{

deletefirststring(string,oldstring);//删除

addstring(string,newstring,pfind);//插入

}

}

3.编写main.c

#include

#include

#include"mystring.h"

voidmain()

{

mystringstring1;

initwithstring(&string1,"note");

printfstring(&string1);

//backaddchar(&string1, 'd');

backaddstring(&string1,"padnotepadnotepad");

printfstring(&string1);

while(findfirststring(&string1,"notepad"))

{

changefirststring(&string1,"notepad","123456789");

}

//char *p = findfirstchar(&string1, 't');

//if (p != NULL)

//{

//addstring(&string1,"12345", p);

//}

//deletefirstchar(&string1, 'e');

//deletefirststring(&string1, "pad");

//char *strp = findfirstchar(&string1, 'a');

//*strp = 'A';

/*char *strp = findfirststring(&string1,"ada");

if (strp != NULL)

{

*strp = 'X';

}*/

printfstring(&string1);

//run(&string1);

system("pause");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值