今天在这里把零散的一些常用的字符串操作函数和内存拷贝函数进行一下归总实现。


一 . 字符串操作函数


字符串操作函数有很多,这里我列举一些常用的函数,以及自实现的代码:

字符串拷贝函数:

函数原型:

char*my_strcpy(char*dst,constchar*src)

strcpy():

char*my_strcpy(char*dst,constchar*src){assert(dst);assert(src);char*ret=dst;//把首地址保存起来,因为下面会修改dstwhile(*dst++=*src++);returnret;}

函数原型:

char*my_strncpy(char*dst,constchar*src,intn)

strncpy():

char*my_strncpy(char*dst,constchar*src,intn){assert(dst);assert(src);char*ret=dst;while(n--){*dst++=*src++;}returnret;}

字符串追加函数:

函数原型:

char*my_strcat(char*dst,constchar*src)

strcat():

char*my_strcat(char*dst,constchar*src){assert(dst);assert(src);char*ret=dst;while(*dst)dst++;while(*dst++=*src++);returnret;}

函数原型:

char*my_strncat(char*dst,constchar*src,intn)

strncat():

char*my_strncat(char*dst,constchar*src,intn){assert(dst);assert(src);char*ret=dst;while(*dst)dst++;while(n--){*dst++=*src++;}returnret;}

字符串比较函数:

函数原型:

intmy_strcmp(constchar*dst,constchar*src)

strcmp():

intmy_strcmp(constchar*dst,constchar*src){assert(dst);assert(src);while((*dst==*src)&&*dst&&*src){dst++;src++;if(*dst==0&&*src==0){return1;}}return-1;}

函数原型:

intmy_strncmp(char*dst,constchar*src,intn)

strncmp():

intmy_strncmp(char*dst,constchar*src,intn){assert(dst);assert(src);while(n--){if((*dst==*src)&&*dst&&*src){dst++;src++;}else{return-1;}if(*dst==0&&*src==0)//全部相同时的处理情况{return1;}}return1;//部分相同时的处理情况}

查找子字符串函数:

函数原型:

char*my_strtsr(char*str1,char*str2)

strstr():

char*my_strtsr(char*str1,char*str2){assert(str1);//原串assert(str2);//子串char*s1=str1;char*s2=str2;char*s=str2;//保存子串的首地址if(*s1==0){if(*s2)returnNULL;returns;}while(*s1&&*s2){if(*s1!=*s2){s1++;}if(*s1==*s2){s1++;s2++;}if(*s1!=*s2){if(*s1==0){returnNULL;}elseif(*s2==0){returns;}s2=s;//若*s1和s2不相等,则让子串重新从头开始}}returnNULL;}





二 . 内存拷贝函数

内存拷贝函数这里罗列出 memcpy() 以及解决内存拷贝时重叠的问题的函数 memmove() ,附带写出内存初始化函数memset() .


内存拷贝函数:

函数原型:

void*my_memcpy(void*dt,constvoid*src,size_tcount)

memcpy():

void*my_memcpy(void*dst,constvoid*src,size_tcount){assert(dst);assert(src);char*pDst=(char*)dst;char*pSrc=(char*)src;char*ret=(char*)dst;//保存dst首地址while(count--){*pDst++=*pSrc++;}returnret;}

解决内存拷贝时 的内存重叠问题的函数:

函数原型:

void*my_memmove(void*p1,void*p2,size_tcount)

memmove():

void*my_memmove(void*p1,void*p2,size_tcount){//在一个数组中进行assert(p1);assert(p2);char*dst=(char*)p1;char*src=(char*)p2;char*ret=(char*)p1;//保存首地址if(dst>src&&(dst<src+count))//判断内存重叠情况{while(count--){*(dst+count)=*(src+count);}}else//不重叠情况{while(count--){*dst++=*src++;}}returnret;}

内存初始化函数:

函数原型:

void*my_memset(void*arr,intc,size_tsize)

memset():

void*my_memset(void*arr,intc,size_tsize){assert(arr);char*dst=(char*)arr;inti=0;for(i=0;i<size;i++){*(dst+i)=c;}returnarr;}

附源代码及测试代码:

#include<stdio.h>#include<assert.h>#include<stdlib.h>char*my_strcpy(char*dst,constchar*src){assert(dst);assert(src);char*ret=dst;//把首地址保存起来,因为下面会修改dstwhile(*dst++=*src++);returnret;}char*my_strncpy(char*dst,constchar*src,intn){assert(dst);assert(src);char*ret=dst;while(n--){*dst++=*src++;}returnret;}char*my_strcat(char*dst,constchar*src){assert(dst);assert(src);char*ret=dst;while(*dst)dst++;while(*dst++=*src++);returnret;}char*my_strncat(char*dst,constchar*src,intn){assert(dst);assert(src);char*ret=dst;while(*dst)dst++;while(n--){*dst++=*src++;}returnret;}intmy_strcmp(constchar*dst,constchar*src){assert(dst);assert(src);while((*dst==*src)&&*dst&&*src){dst++;src++;if(*dst==0&&*src==0){return1;}}return-1;}intmy_strncmp(char*dst,constchar*src,intn){assert(dst);assert(src);while(n--){if((*dst==*src)&&*dst&&*src){dst++;src++;}else{return-1;}if(*dst==0&&*src==0)//全部相同时的处理情况{return1;}}return1;//部分相同时的处理情况}char*my_strtsr(char*str1,char*str2){assert(str1);//原串assert(str2);//子串char*s1=str1;char*s2=str2;char*s=str2;//保存子串的首地址if(*s1==0){if(*s2)returnNULL;returns;}while(*s1&&*s2){if(*s1!=*s2){s1++;}if(*s1==*s2){s1++;s2++;}if(*s1!=*s2){if(*s1==0){returnNULL;}elseif(*s2==0){returns;}s2=s;}}returnNULL;}void*my_memcpy(void*dst,constvoid*src,size_tcount){assert(dst);assert(src);char*pDst=(char*)dst;char*pSrc=(char*)src;char*ret=(char*)dst;//保存dst首地址while(count--){*pDst++=*pSrc++;}returnret;}void*my_memmove(void*p1,void*p2,size_tcount){//在一个数组中进行assert(p1);assert(p2);char*dst=(char*)p1;char*src=(char*)p2;char*ret=(char*)p1;//保存首地址if(dst>src&&(dst<src+count))//判断内存重叠情况{while(count--){*(dst+count)=*(src+count);}}else//不重叠情况{while(count--){*dst++=*src++;}}returnret;}void*my_memset(void*arr,intc,size_tsize){assert(arr);char*dst=(char*)arr;inti=0;for(i=0;i<size;i++){*(dst+i)=c;}returnarr;}voidtest1(){chara1[10]={0};chara2[]="world";printf("%s",my_strcpy(a1,a2));printf("\n");}voidtest2(){chara1[15]="hello";chara2[]="world";printf("%s",my_strcat(a1,a2));printf("\n");}voidtest3(){chara1[]="abcdef";chara2[]="abcdef";printf("%d\n",my_strcmp(a1,a2));}voidtest4(){chara1[10]="hello";chara2[]="world";printf("%s",my_strncat(a1,a2,4));printf("\n");}voidtest5(){inta1[10]={1,2,3,4,5,6,7,8,9,10};inta2[10];inti=0;my_memcpy(a2,a1,4);for(i=0;i<10;i++){printf("%d",a2[i]);}printf("\n");}voidtest6(){inta[10]={1,2,3,4,5,6,7,8,9,10};inti=0;my_memmove(a+2,a+5,4);for(i=0;i<10;i++){printf("%d",a[i]);}printf("\n");}voidtest7(){chara1[10]={0};chara2[]="world";printf("%s",my_strncpy(a1,a2,3));printf("\n");}voidtest8(){chara1[]="abcdef";chara2[]="acb";printf("%d\n",my_strncmp(a1,a2,2));}voidtest9(){char*a1="abccddefgh";char*a2="cddef";printf("%s",my_strtsr(a1,a2));printf("\n");}voidtest10(){intarr[10];inti=0;my_memset(arr,0,32);for(i=0;i<10;i++)printf("%d",arr[i]);printf("\n");}intmain(){test1();test2();test3();test4();test5();test6();test7();test8();test9();test10();system("pause");return0;}

若有纰漏,欢迎指正。