memcpy 、 strncpy、memmove 总结

memcpy

函数介绍
函数声明:void * memcpy ( void * destination, const void * source, size_t num );
参数
目的地:指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。
源:指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
数字:要复制的字节数。 size_t 是无符号整数类型。
头 文 件:#include <string.h>
返 回 值: 返回目的地。
函数memcpy从source的位置开始向后复制num个字节的数据到destinatation

**  为避免溢出,目标参数和源参数所指向的数组的大小应至少为 num 个字节,并且不应重叠(有任何的重叠,复制的结果都是未定义的,对于重叠的内存块,memmove 是一种更安全的方法)。 **

重叠示例

#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	memcpy(arr1 + 2, arr1, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	return 0;
}

在这里插入图片描述

自定实现memcpy解决重叠问题

#include <stdio.h>
#include <string.h>
void* MyMemcpy(void* dest, const void* src, size_t size)
{
	if (dest == NULL || src == NULL)
	{
		return NULL;
	}

	char* psrc = NULL;
	char* pdest = NULL;
	void* ret = dest;

	// 判断dest和src是否重叠
	if (dest > src && (char*)dest < (char*)src + size)
	{
		char* psrc = (char *)src + size - 1;
		char* pdest = (char*)dest + size - 1;
		while (size--)
		{
			*pdest-- = *psrc--;
		}
	}
	else
	{
		psrc = (char *)src;
		pdest = (char*)dest;
		while (size--)
		{
			*pdest++ = *psrc++;
		}
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10,0,0 };
	MyMemcpy(arr1 + 2, arr1, 10*sizeof(int));
	for (int i = 0; i < sizeof(arr1) / sizeof(int); i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

在这里插入图片描述

memmove

函数介绍

函数介绍
void *memmove(void str1, const void str2, size_t n)
参数
str1(dest) – 指向用于存储复制内容的目标数组,类型强制转换为 void
指针。
str2(src)-- 指向要复制的数据源,类型强制转换为 void
指针。
n – 要被复制的字节数。
返回值
该函数返回一个指向目标存储区 str1 的指针。

#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10,0,0 };
	memmove(arr1 + 2, arr1, 10*sizeof(int));
	for (int i = 0; i < sizeof(arr1) / sizeof(int); i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

在这里插入图片描述

strncpy、strcpy

函数介绍

char *strcpy(char *dest, const char *src);
参数
dest:目标字符串指针,
src :为源字符串指针。
strcpy() 把src所指的由’\0’结束的字符串复制到dest 所指的数组中,并且包括’\0’,返回指向 dest 字符串的起始地址。
注意:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。

#include <stdio.h>
#include <string.h>
int main()
{
	char s[] = "12345678";
	char s1[9];
	strcpy(s1, s);
	printf("%s\n", s1);
	return 0;
}

在这里插入图片描述

char * strncpy(char *dest, const char *src, size_t n);
参数
dest:目标字符串指针,
src: 源字符串指针
n: 复制长度
注意:n需要小于dest和src的长度,strncpy不会保证’\0’

不会保证"\0"

#include <stdio.h>
#include <string.h>

int main()
{
	char s[] = "12345678";
	char s1[9];
	strncpy(s1, s, 7);
	printf("%s\n", s1);
	return 0;
}

在这里插入图片描述
strncpy和strcpy都不能用于重叠的情况

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值