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");
}