【C语言】 字符串操作函数及内存拷贝函数归总
今天在这里把零散的一些常用的字符串操作函数和内存拷贝函数进行一下归总实现。
一 . 字符串操作函数
字符串操作函数有很多,这里我列举一些常用的函数,以及自实现的代码:
字符串拷贝函数:
函数原型:
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;}
若有纰漏,欢迎指正。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。