模拟实现mymcpy,memmove,strncpy
发布日期:2021-09-19 03:18:17 浏览次数:3 分类:技术文章

本文共 1694 字,大约阅读时间需要 5 分钟。

memcpy函数实现

memcpy: 内存拷贝函数  void *memcpy(void *dest ,const void *scr,size_t n);  从src所指向的内存地址的起始位置开始拷n个字节到目标dest所指的内存地址的起始位置中 。返回dest的指针。头文件#include<srtring.h>
1.src和dest所指的内存区域可能重叠,但是如果src和dest所指的内存区域重叠,那么这个函数并不能够确保src所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。
2.src和dest都不一定是数组,任意的可读写的空间均可
void* my_memcpy(void *dest, const void *src, size_t n){	void *ret = dest;	while (n--)	{		*(char*)dest = *(char*)src;		dest = (char*)dest + 1;		src = (char*)src + 1;	}	return (ret);}

memmove函数实现

memmove: void *memcpy(void *dest ,const void *scr,size_t n);   
用于从src拷贝n个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前
将重叠区域的字节拷贝到目标区域中
。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
void* my_memmove(void *dest, const void *src, size_t n){	void *ret = dest;	if (dest <= src || (char*)dest >= ((char*)src + n))	{		while (n--)		{			*(char*)dest = *(char*)src;			dest = (char*)dest + 1;			src = (char*)src + 1;		}	}	else	{		dest = (char*)dest + n - 1;		src = (char*)src + n - 1;		while (n--)		{			*(char*)dest = *(char*)src;			dest = (char*)dest - 1;			src= (char*)src - 1;		}	}	return (ret);}

strncpy函数实现

strncpy:        char *strncpy(char *dest, const char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。
1. src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
        1) 如果n>src,正常复制,如果src中有NULL,strncpy复制到NULL即使没到n也提前停止。
        2) 如果n = src串长度,与strcpy一致。
        
3) 当n > dest串长度,dest栈空间溢出产生崩溃异常。
2. src串长度>dest串长度
        如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest 最后一字符置为NULL。
char* my_strncpy(char *dest, const char *src, size_t n){	char* ret = dest;	assert(dest);	assert(src);	while (n--)	{		*dest++ = *src++;	}	*dest = '\0';//将dest最后置null	return 0;}

memcpy和strncpy区别

memcpy:内存拷贝,不仅仅能拷贝字符串,它可以完整的拷贝n个字符,不会遇到 '\0' 就停止
strncy:   字符串拷贝,遇到'\0'就停止。

转载地址:https://blog.csdn.net/audience_fzn/article/details/76834504 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:指针数组,数组指针,函数指针,函数指针数组,指向函数指针数组的指针
下一篇:通讯录动态实现

发表评论

最新留言

很好
[***.229.124.182]2024年04月07日 14时45分16秒