首页 > 代码库 > 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");

}