首页 > 代码库 > c语言中字符串操作的工具类
c语言中字符串操作的工具类
1.编写头文件
#define_CRT_SECURE_NO_WARNINGS
//#pragmawarning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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);
//改变字符
void changefirstchar(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)
{
return NULL;//为空没有必要干活了
}
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++;
}
return NULL;//返回
}
char *mystrstr(constchar *const dest,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)
{
return 0;
}
else
{
char *pnext = p + 1;
while (*pnext != ‘\0‘)
{
*p = *pnext;//删除一个字符整体向前移动
p++;
pnext++;
}
*p =‘\0‘;//字符串要有结尾
return 1;
}
}
intdeletefirststring(mystring *string,char *conststr)
{
char *pres = mystrstr(string->p,str);//查找
if (pres == NULL)
{
return 0;
}
else
{
intlength =mystrlen(str);//求字符串长度
char *pnext = pres +length;//下一个字符
while (*pnext != ‘\0‘)
{
*pres = *pnext;//删除一个字符整体向前移动
pres++;
pnext++;
}
*pres =‘\0‘;//字符串要有结尾
return 1;
}
}
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 <insertlength;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 <insertlength;j++)
{
string->p[nowlength - movelength +j] =str[j];//赋值拷贝
}
}
}
void changefirstchar(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<stdio.h>
#include<stdlib.h>
#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");
}