【19】实现strcpy和memcpy函数

简介: 一. strcpy函数1. strcpy的原型是char* strcpy(char *des, const char *src); 返回des指针。


一. strcpy函数

1. strcpy的原型是char* strcpy(char *des, const char *src); 返回des指针。

    作用是把src指针指向的字符串复制到des指针指向的字符串中。

2. des所指向的内存空间要足够大保证能够容纳src所指的字符串,strcpy函数碰到第一个\0字符的时候结束复制

3. strcpy函数的实现,考虑内存重叠

//strcpy函数实现
char* strcpy(char *des, const char *src){
	//空指针报异常
	if(des == NULL || src == NULL){
	    throw exception("error");
		return NULL;
	}
	//如果是自己复制自己直接返回
	if(des == src){
	    return des;
	}
    //求出stc指向的字符串长度
	int length = strlen(src);
	//考虑内存重叠
	if((des > src) && (des < src+length)){
		//从后往前复制
		for(int i = length-1; i >= 0; i--){
		    des[i] = src[i];
		}
	}
	else{
	    //从前往后复制
		for(int i = 0; i < length; i++){
		    des[i] = src[i];
		}
	}
	//最后一位赋值为\0
	des[length] = '\0';
	return des;
}

二. memcpy函数

1. memcpy是C语言中的内存复制函数,它的函数原型是 void* memcpy(void *des, const void *src, size_t count),返回des指针变量。

    作用是把src指向的内存地址空间中的count个字节复制到des指向的内存空间。

2. des和src所指向的内存空间是不能重叠的,memcpy可以复制任何数据类型,并且必须复制count个字节。

3. memcpy函数的实现,考虑内存重叠

void* memcpy(void *des, const void *src, size_t count){
	//如果是空指针抛异常
	if(des == NULL || src == NULL){
	    throw exception("error");
	    return NULL;
	}
	//如果自己复制自己直接返回
	if(des == src){
	    return des;
	}
	//转化为字符指针类型
	char *tmpDes = (char*)des;
	char *tmpSrc = (char*)src;
	//考虑内存重叠
	if((tmpDes > tmpSrc) && (tmpDes < (tmpSrc+count))){
	    //从后往前复制
		for(size_t i = count-1; i >= 0; i--){ //注意i是size_t类型
		    tmpDes[i] = tmpSrc[i];
		}
	}
	else{
		//从前往后复制
		for(size_t i = 0; i < count; i++){ //注意i是size_t类型
		    tmpDes[i] = tmpSrc[i];
		}
	}
	return des;
}


三. strcpy和memcpy的区别

1. strcpy是用来复制字符串的,memcpy是用来复制一段内存的

2. strcpy复制字符串的时候遇到\0就结束,memcpy必须复制指定大小的内存才结束



目录
相关文章
|
4月前
|
存储
strcpy、sprintf 与 memcpy 的区别
在 C 语言中,`strcpy`、`sprintf` 和 `memcpy` 是三个用于处理内存和字符串的函数,它们有不同的用途和特点
|
存储 Cloud Native Linux
C++ strcpy、sprintf与memcpy的区别
C++ strcpy、sprintf与memcpy的区别
|
C语言
自己实现strcpy和strlen函数
自己实现strcpy和strlen函数
108 0
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
69 0
|
9月前
|
编译器 C++
C++中memcpy函数的实现
C++中memcpy函数的实现
241 0
|
9月前
|
算法 编译器 C语言
memcpy内存拷贝函数
memcpy内存拷贝函数
131 0
strcpy函数与strncpy函数
strcpy函数与strncpy函数
【memcpy和memmove函数的详解】
我们知道,strcpy函数是拷贝字符串的,但是它并不能拷贝例如整型,结构体之类的东西,strcpy有一定的局限性,memcpy函数可以说涵盖了所有类型数据的拷贝。
|
存储 安全
浅谈C库函数——memcpy、memmove、memcmp、memset函数
浅谈C库函数——memcpy、memmove、memcmp、memset函数
261 0