700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > c语言内存复制函数 【C语言】 字符串操作函数及内存拷贝函数归总

c语言内存复制函数 【C语言】 字符串操作函数及内存拷贝函数归总

时间:2023-02-09 11:08:18

相关推荐

c语言内存复制函数 【C语言】 字符串操作函数及内存拷贝函数归总

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

一 . 字符串操作函数

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

字符串拷贝函数:

函数原型: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;

}

若有纰漏,欢迎指正。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。