今天在这里把零散的一些常用的字符串操作函数和内存拷贝函数进行一下归总实现。
一 . 字符串操作函数
字符串操作函数有很多,这里我列举一些常用的函数,以及自实现的代码:
字符串拷贝函数:
函数原型:char*my_strcpy(char*dst,constchar*src)
strcpy():char*my_strcpy(char*dst,constchar*src)
{
assert(dst);
assert(src);
char*ret=dst;//把首地址保存起来,因为下面会修改dst
while(*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
{
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
{
*(dst+i)=c;
}
returnarr;
}
附源代码及测试代码:#include
#include
#include
char*my_strcpy(char*dst,constchar*src)
{
assert(dst);
assert(src);
char*ret=dst;//把首地址保存起来,因为下面会修改dst
while(*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
{
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
{
*(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
{
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
{
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
printf("%d",arr[i]);
printf("\n");
}
intmain()
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
test10();
system("pause");
return0;
}
若有纰漏,欢迎指正。