【19】实现strcpy和memcpy函数

一. 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必须复制指定大小的内存才结束

时间: 2024-10-21 08:49:17

【19】实现strcpy和memcpy函数的相关文章

深入理解strcpy与memcpy的区别_C 语言

strcpy与memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符.已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);memcpy提供了一般内存的复制.即memcpy对于需要复制的内容没有限制,因此用途更广.void *memcpy( void *dest, const void *src, size_t count );

对比C语言中memccpy()函数和memcpy()函数的用法_C 语言

C语言memccpy()函数:复制内存中的内容头文件: #include <string.h> 定义函数: void * memccpy(void *dest, const void * src, int c, size_t n); 函数说明:memccpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上.与memcpy()不同的是,memccpy()会在复制时检查参数c 是否出现,若是则返回dest 中值为c 的下一个字节地址. 返回值:返回指向dest 中值为c 的下

memcpy函数

c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. (可以复制其他任意数据类型) strcpy(a,b); 只能将b字符串复制给a字符串 函数原型 void *memcpy(void *dest, const void *src, size_t n); 功能 从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 先讲复制字符串: #include <iostre

C/C++基础面试集锦(一)strcpy、memcpy

**一.strcpy函数实现方法** char* strcpy(char *dest, const char *src) { assert((dest != NULL) && (src != NULL)); char *DesSrc = dest; while((*dest++ = *src++)!='\0'); return DesSrc; } 二.获取字符串长度函数实现方法 代码一 int getStrLen1(const char *strSrc) { int len = 0; wh

提前认识软件开发(8) memset()与memcpy()函数

软件项目中的代码,少则数千行,多则上万行,但并非无规律可循.阅读了那么多代码之后,我发现有两个函数出现的频率很高,那就是memset()与memcpy()函数,它们都是C语言编程中经常要用到的.工作之余,我查了一些资料,现对它们作一个简单的说明. 1. memset()函数 (1)函数原型 void *memset( void *dest, int c, size_t count ). (2)函数作用 在MSDN中,将该函数的作用描述为:Sets buffers to a specified c

让你提前认识软件开发(8):memset()与memcpy()函数

第1部分 重新认识C语言 memset()与memcpy()函数           软件项目中的代码,少则数千行,多则上万行,但并非无规律可循.阅读了那么多代码之后,我发现有两个函数出现的频率很高,那就是memset()与memcpy()函数,它们都是C语言编程中经常要用到的.工作之余,我查了一些资料,现对它们作一个简单的说明.         1. memset()函数         (1)函数原型         void *memset( void *dest, int c, size

在调用memcpy函数时出现 异常: 0xC0000005: 读取位置 0x006bd000 时发生访问冲突

问题描述 在调用memcpy函数时出现 异常: 0xC0000005: 读取位置 0x006bd000 时发生访问冲突 BOOL Kirsch(BYTE *pData,int Width,int Height) {//定义实现Kirsch算法的8个模板: int i,j,s,t,k,max,sum[8]; static int a[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}}; static int a1[3][3]={{-3,+5,+5},{-3,0,+5},

JAVA实现C语言中的memcpy函数

问题描述 在得不到首地址的情况下如何更好地用JAVA实现memcpy函数 解决方案 解决方案二:为啥要操作内存呢?你需要实现什么功能呢?如果是拷贝数组,可以在Arrays类里找到封装好的方法.解决方案三:引用1楼oh_Maxy的回复: 为啥要操作内存呢?你需要实现什么功能呢?如果是拷贝数组,可以在Arrays类里找到封装好的方法. 因为我想操作24-bit的bmp格式图片,实现它的旋转,模拟了好了旋转的方法后,我想将旋转的图保存到一个新文件,因为24-bit的位图是一个像素对应3个字节,所以我想

C函数之memcpy()函数用法

头文件:#include <string.h> memcpy() 用来复制内存,其原型为:    void * memcpy ( void * dest, const void * src, size_t num ); memcpy() 会复制 src 所指的内存内容的前 num 个字节到 dest 所指的内存地址上. memcpy() 并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制. 需要注意的是: dest 指针要分配足够的空