strcpy、strncpy与memcpy的区别你了解吗?

定义

1.memcpy函数

void *memcpy(void *destin, void *source, unsigned n);

作用:函数memcpy从source指向的对象中复制n个字符到destin指向的对象中

返回值:函数memcpy返回destin的指针。

2.strcpy函数

char strcpy(char dest, const char *src);

作用:函数strcpy把src指向的串(包括空字符)复制到dest指向的数组中,src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

返回值:函数strcpy返回dest的指针。

3.strncpy函数

char *strncpy(char *destinin, char *source, int maxlen);

作用:复制字符串source中的内容(字符,数字、汉字….)到字符串destinin中,复制多少由maxlen的值决定。source和destinin所指内存区域不可以重叠且destinin必须有足够的空间来容纳source的字符长度+‘\0’。

返回值:函数strncpy返回destinin的值。

实现

看看strcpy函数的实现

char *myStrcpy(char *des,char *src){
    
    
	if(des == NULL || src == NULL){
    
    
		return NULL;
	}//先看des和src的数据是否为null
	char *bak = des;//取des地址赋bak指针
	while(*src != 0){
    
    //当src的数据(p的原始数据)不为0,继续执行
		*des = *src;//src的数据赋值给des
		des++;
		src++;//des和src的地址++下一个
	}
	*des = '\0';//while停止,也就是到src的数据位最后一位,此时令'\0'赋des
	return bak;
}

strncpy函数的实现

char *myStrncpy(char *des,char *src,int count){
    
    
	if(des == NULL || src == NULL){
    
    
		return NULL;
	}
	char *bak = des;
	while(*src != 0 && count > 0){
    
    
		*des++ = *src++;//src的数据先赋值给des;src++;des++
		count--;
	}
	if(count > 0){
    
    
		while(count > 0){
    
    
			*des++ = '\0';
			count--;
		}
		return des;
	}
	
	*des = '\0';
	return bak;
}

memcpy函数的实现

void * myMemcpy(void *dest, void *src, unsigned count)
{
    
    
	if (dest == NULL || src == NULL)
	{
    
    
		return NULL;
	}
	char* pdest = (char*)dest;
	char* psrc = (char*)src;
	while (count--)
	{
    
    
		*pdest++ = *psrc++;
	}
	return dest;
}

区别

1、strcpy 是依据 “\0” 作为结束判断的,如果 dest 的空间不够,则会引起 buffer overflow。

2、memcpy用来在内存中复制数据,由于字符串是以"\0"结尾的,所以对于在数据中包含"\0"的数据只能用memcpy。(通常非字符串的数据比如结构体都会用memcpy来实现数据拷贝)

3、strncpy和memcpy很相似,只不过它在一个终止的空字符处停止。当n>strlen(src)时,给dest不够数的空间里填充"\0“;当n<=strlen(src)时,dest是没有结束符"\0“的。这里隐藏了一个事实,就是dest指向的内存一定会被写n个字符。

4、strcpy只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出。strncpy要安全一些。strncpy能够选择一段字符输出,strcpy则不能。


总结

1、dest指向的空间要足够拷贝;使用strcpy时,dest指向的空间要大于等于src指向的空间;使用strncpy或memcpy时,dest指向的空间要大于或等于n。

2、使用strncpy或memcpy时,n应该大于strlen(s1),或者说最好n >= strlen(s1)+1;这个1 就是最后的“\0”。

3、使用strncpy时,确保s2的最后一个字符是"\0”。

猜你喜欢

转载自blog.csdn.net/qq_44333320/article/details/125715798