关于拷贝函数的实现解析

本文详细介绍了C语言中的拷贝函数,包括strcpy、strncpy、memcpy和memmove的使用方法及注意事项,并提供了模拟实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于拷贝函数分为两类,一类是strcpy,strncpy,第二类是memcpy,memove,通常情况下,第一类只能处理char,char*的字符串类型,第二种可以处理任意类型,它们四个函数都在C语言的库函数中,头文件为string.h。它们的原型分别如下:

char *strcpy( char *strDestination, const char *strSource );

char *strncpy( char *strDest, const char *strSource, size_tcount );

void *memcpy( void *dest, const void *src, size_tcount );

void *memmove( void *dest, const void *src, size_tcount );

这里有个小的知识点就是void *后面加参数,表示可接受任意类型。

在字符串拷贝函数中,strcpy表示的是不受限制的复制字符串拷贝函数,所谓的不受限制就是说它们只是通过寻找字符串结尾的'\0'来判断它的长度在使用时,程序员必须保证结果字符串不会溢出这块内存。使用这个函数时需要注意的事项:

1.如果参数src和dst在内存中出现重叠现象,其结果是未定义的。

2.由于dst参数将进行修改,所以它必须是一个字符数组或指向动态分配内存的数组的指针,不能使用字符串常量。

3.参数src是不变的,应用const修饰。

4.目标参数以前的内容将覆盖并丢失,即使源字符串比目标字符串更短,目标字符串最后剩余的字符也会丢失。

下面我们来模拟实现一下:

char* my_strcpy(char *dst,char *src)
{
	assert(dst);
	assert(src);
	while(*src = '\0')
	{
		*dst++ = *src++;
	}
	return dst;
}
受限制的字符串拷贝函数strncpy,所谓受限制,就是C标准库中包含了一些函数,他们用不同的方式处理字符串,这些函数接受一个显示长度的参数,用于限定进行复制或比较的字符数,这些函数提供了一种方便的机制,可以预防难以预料的长字符串从他们的目标数组中溢出。

下面我们来模拟实现一下strncpy函数:

char *my_strncpy(char *dst,const char *src,int len)
{
         assert(dst);
         assert(src);
         char *pdst = dst;
         while(len--){
               *dst++ = *src++;
          }
          *dst = '\0';
           return pdst;
}
memcpy和memove都是拷贝函数,但memove考虑到两个缓存区的重叠问题,通常情况下一般用memove来进行拷贝,因为memcpy属于memove的一种情况,这里我们只实现memove函数。当目标地址低于原始地址时,应从前往后拷贝,当目标地址高于原始地址时,应从后往前拷贝。

下面我们来模拟实现一下memove函数:

void *my_memmove(void *dst, void *src, int count)
{
	assert(dst);
	assert(src);
	char *_dst = (char*)dst;
	char *_src = (char*)src;
	char *ret = _dst;

	if (_src < _dst && _src + count > _dst){//后-》前
		char *_dst_end = _dst + count - 1;
		char *_src_end = _src + count - 1;
		while (count--){
			*_dst_end = *_src_end;
			_dst_end--, _src_end--;
		}

	}else{
		while (count--){
			*_dst = *_src;
			_dst++, _src++;
		}
	}
	return ret;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值