strcpy,memcpy和memmove区别
strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_tcount);
char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性{return NULL;}char *strdest = dest; //保存目标字符串的首地址while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下return strdest;
}
void *memcpy(void *memTo, const void *memFrom, size_t size)
{if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效return NULL;char *tempFrom = (char *)memFrom; //保存memFrom首地址char *tempTo = (char *)memTo; //保存memTo首地址 while(size -- > 0) //循环size次,复制memFrom的值到memTo中*tempTo++ = *tempFrom++ ; return memTo;
}
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
相关函数: bcopy(), memccpy(), memmove(), strcpy(), strncpy()
表头文件: #include <string.h>
定义函数: void *memcpy(void *dest, const void *src, size_t n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束
返回值: 返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠
-------------------------------------------------------
#include <string.h>
#include <stdio.h>
int main()
{
char a[30] = "string (a)";
char b[30] = "hi\0zengxiaolong";
int i;
strcpy(a, b); //a[30] = "hi\0ing (a)"
printf("strcpy():");
for(i = 0; i < 30; i++)
printf("%c", a[i]); //hi ing (a)
memcpy(a, b, 30); //a[30] = "hi\0zengxiaolong"
printf("\nmemcpy():");
for(i = 0; i < 30; i++)
printf("%c", a[i]); //hi zengxiaolong
printf("\n i = %d\n", i); //30
}
----------------------------------------
memcpy和memmove区别
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。
但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。
memcpy实现
void* memcpy(void* dest, const void* src, size_t n)
{char* d = (char*) dest;const char* s = (const char*) src;while(n-–) *d++ = *s++;return dest;
}
memmove实现
void* memmove(void* dest, const void* src, size_t n)
{char* d = (char*) dest;const char* s = (const char*) src;if (s>d) {// start at beginning of swhile (n--)*d++ = *s++;}else if (s<d){// start at end of sd = d+n-1;s = s+n-1;while (n--)*d-- = *s--;}return dest;
}
strcpy,memcpy和memmove区别相关推荐
- 【C/C++】C语言复制字符串及复制函数汇总(strcpy()/memcpy()/strncpy()/memmove())
目录: strcpy() 举例: memcpy() 举例: strncpy() 举例: memmove() 举例: 我们首先来考虑一个简单的问题,我们定义了一个字符串,然后想要复制这个字符串,在C语言 ...
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
一.函数介绍: 1.memcpy 函数原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include< ...
- C语言 -- string.h中函数功能详解与手动实现 - 02(常用函数memcpy、memmove、strcpy、strdup、strcat、strtok...)
内容预览 3.5.搬迁类型 --- 函数功能详细说明 :将内存空间中内容移动.复制到另一内存空间 3.6.搬迁类型 --- 函数功能测试与手动实现 3.6.1.memcpy.memccpy 3.6.2 ...
- strcpy和memcpy的区别 | strcpy和strncpy的区别
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...
- memcpy和memmove的区别以及内存重叠问题
memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...
- 《strcmp,strcpy,memcpy,memmove等函数模拟实现》
模拟实现常见字符串函数比如:strcmp,strcpy,memcpy,memmove等函数 1.模拟实现memcpy函数 2.模拟实现memmove函数 3.模拟实现strstr函数 4.模拟实现st ...
- 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat
用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...
- 关于memcpy和memmove两函数的区别
http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plain copy <p> 关于memcpy和m ...
- memcpy和memmove函数的区别
文章目录 前言 memcpy函数 memmove函数 memcmp函数 前言 c语言<string.h>库里面有很多的字符函数,比如memcpy,memmove,memcmp等,这些函数是 ...
最新文章
- Oracle查看并修改最大连接数
- Gallery 3D+倒影 滑动切换图片示例(转)
- 团体程序设计天梯赛-练习集L1-023. 输出GPLT
- 2021-06-13读写锁=独占锁与共享锁
- 2017年编程语言排名
- Matlab2017a汉化版软件详细安装教程
- java db4o 教程_面向Java开发人员db4o指南:数组和集合 (1)
- 轨道客流预测TransCAD公交分配结果详解
- 如何演示扇形面积公式推导过程
- 中级程序员还应该如何提高自己
- 折线图播放器组件 - elementui - ehcart
- 苹果手机有4g信号但是微信未连接服务器,苹果5s有显示4g网络但无上微信 是不是那里设置了 今天才出现的...
- 【用例设计】接口用例设计
- php GD库做水印功能,合并图片
- 好用的需求文档管理工具Telelogic DOORS
- AI开发过程中常用开发命令及软件安装
- top SRM526.5
- 团队做项目该怎样分工
- 计算机无法连接iphone,iTunes不识别iPhone?iTunes无法连接iPhone怎么办
- Visio View:打开VSd时,IE弹出已停止工作。
热门文章
- MySQL面试题 | 附答案解析(二十)
- 2020年全球十大突破性技术公布:数字货币等在列
- Spatial As Deep: Spatial CNN for Traffic Scene Understanding论文翻译
- linux mud 游戏,快刀幻想mud文字传奇-快刀幻想mud神器兑换码-快刀幻想mud下载v1.80-Linux公社...
- PCL深度图像(2)
- 【疑难杂症】vue npm run build的时候遇到Module build failed: Error: No ESLint configuration found.报错提示咋办呀?
- 在Ubuntu 16.04.6 LTS升级python 3.5.x到3.7.3之后导致gnome-ternimal无法打开的解决办法
- 在Ubuntu 14.04 64bit上安装下载管理器FlareGet 4.2.92
- 趣谈HTTP协议中的那些MIME header
- 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)