字符串函数---memcpy()详解及实现(完整版)

一、memcpy()函数详解

1.函数原型

memcpy():void *memcpy(void *dest,const void *src,size_t count);

dest:新缓冲区。

src:复制的缓冲区。

count:要复制的字符数。

说明:如果源和目标字符串重叠,则 memcpy 的行为未定义。(来自与msdn上面的解释)

2.对memcpy()函数的测试

(1)通过以下例子可以看到,memcpy()函数将数组a前9个字符拷贝给了数组b,数组b后面没有加‘\0‘,故一般要记得对数组b进行初始化;假如将下面程序的9改为10,则会拷贝数组a的‘\0‘给数组b。

char a[]="lanzhihui";
	char b[10];

	memcpy(b,a,9);

	cout<<a<<endl;
	cout<<b<<endl;

(2)通过以下截图可以看到,拷贝过程不是‘\0‘为结束符,而是以9这个字符个数为结束符,故实现memcpy()函数时,只需要考虑数字9这个条件。

char a[20]="lanzhi\0hui";

	for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
	cout<<a[i];
	cout<<endl;

	memcpy(a+2,a,9);

	for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
	cout<<a[i];
	cout<<endl;

(3)通过以下可以看出,memcpy()函数第一个参数与第二个参数为同一个数组时,也可以进行拷贝,但是注意数组元素不能越界。

char a[20]="lanzhihui";

	cout<<a<<endl;

	memcpy(a+2,a,9);

	cout<<a<<endl;

(4)对memcpy()函数第三个参数分析:memcpy(a+i,a,j);  只要i、j为正,且i+j<=sizeof(a)即可。不然会造成越界错误。

但是请注意:假如下面程序写成memcpy(a+10,a,9);则输出不会为:lanzhihuilanzhiui,因为原数组输出是以‘\0‘结束的,而原数组a[9]=‘\0‘,而拷贝后a[10]=‘l‘,即a[10]以后有字符,但是输出到a[9]就结束输出了。

char a[20]="lanzhihui";

	cout<<a<<endl;

	memcpy(a+2,a,18);

	cout<<a<<endl;

二、memcpy()函数的实现

只有充分测试了memcpy()函数,才能实现好memcpy()函数的功能。

memcpy()具体实现:

#include<iostream>
#include<assert.h>

using namespace std;

void *memcpy_my(void *dest,const void *str,int n)
{
	assert(dest!=NULL&&str!=NULL);
	char *dest_t=(char*)dest+n-1;
	char *str_t=(char*)str+n-1;

	while(n--)
	{
		*dest_t--=*str_t--;
	}
	return dest;
}

int main()
{
	char a[20]="lanzhihui";

	cout<<a<<endl;

	memcpy_my(a+2,a,9);

	cout<<a<<endl;

	system("pause");
	return 0;
}
时间: 2024-08-27 21:12:41

字符串函数---memcpy()详解及实现(完整版)的相关文章

Python学习入门教程,字符串函数扩充详解

因有用户反映,在基础文章对字符串函数的讲解太过少,故写一篇文章详细讲解一下常用字符串函数.本文章是对:程序员带你十天快速入门Python,玩转电脑软件开发(三)中字符串函数的详解与扩充. 如果您想学习并参与本教程的完善与写作.请在下方讨论区,回复相关问题.一起完善本文章教程的书写. Python字符串常用函数. 声明字符串变量: str = ‘关注做全栈攻城狮,写代码也要读书,爱全栈,更爱生活.’ 下面所有字符串函数函数,是对变量str进行操作: 求字符串长度: 函数使用: 运行结果: 值得注意

Python面试合集 史上最全面Python面试题和详解(10套) 完整版

本文件内含10个文档,文档格式为md,可以以文本的形式打开.内容如题,全面的Python面试题和详解,需要的朋友可下载试试! 包含:2019 Python最新面试题及答案16道题.110道Python面试题(上).最常见的 35 个 Python 面试题及答案(2018 版).整理的最全 python常见面试题(基本必考)等! 下载地址 https://pan.baidu.com/s/1XgpPig-KpR8ox0vWuTwVIw 如需提取码: [打开微信]->[扫描下方二维码]->[关注数据

c++中内存拷贝函数(C++ memcpy)详解

原型:void*memcpy(void*dest, const void*src,unsigned int count); 功能:由src所指内存区域复制count个字节到dest所指内存区域. 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针. 举例: // memcpy.c #include <stdlib.h> #include <string.h> main() { char *s= "Golden Global View "; c

PHP输出缓冲控制- Output Control 函数应用详解

说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统 是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会在浏览器上显示. 其实对于PHP程序员来说,基本上每个脚本都涉及到了输出缓冲,只是在大多数情况下,我们都不需要对

php中的PDO函数库详解

PHP中的PDO函数库详解 PDO是一个“数据库访问抽象层”,作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,PDO更高效.目前而言,实现“数据库抽象层”任重而道远,使用PDO这样的“数据库访问抽象层”是一个不错的选择. PDO中包含三个预定义的类 PDO中包含三个预定义的类,它们分别是 PDO.PDOStatement 和 PDOException. 一.PDO PDO->beginTransaction(

PE文件结构与函数导出表——详解与实例

PE文件结构与函数导出表--详解与实例 随着windows系统从Xp升级到Win7.Win8, 从32位升级到64位,PE文件结构在整体未变的情况下发生了一些小的变动,一方面是推荐的程序装载地址未采用,另一方面,导出函数序号不再是简单的升序,而是一定程度上的进行了乱序.本文首先对PE文件结构进行了详尽的解说,接着介绍了如何得出函数导出表,整个过程采用SysWoW64目录下的wininet.dll实例进行说明.在介绍过程中,明确指出了Win7.Win8等新系统相对Xp带来的区别. 文章链接:htt

自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解

'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解'**说    明:蓝凤凰设计商城 浴火凤凰-郭卫 | 蓝凤凰-魔灵 | 郭卫-icecept'**创 建 人:浴火凤凰-郭卫'**日    期:2015年10月10日  23:13:55'**修 改 人:浴火凤凰-郭卫'**日    期:'**描   

wp_list_categories函数用法详解

本以为写完新手教程之后,可以不写新手应用方面的文章了的,可今天又有朋友在群里问如何显示每个分类下文章数量这个基础性问题,看来Wordpress中文化还有很长的一段路要走,我们任重而道远啊!好,解决你的问题先:正如标题所说,Wordpress是用wp_list_categories这个函数来显示分类的,其用法是:< ?php wp_list_categories('arguments'); ?>arguments即参数,默认参数设置为: $defaults = array('show_optio

eval()函数用法详解

eval()函数用法详解:此函数可能使用的频率并不是太高,但是在某些情况下具有很大的作用,下面就介绍一下eval()函数的用法.语法结构: eval(str) 此函数可以接受一个字符串str作为参数,并把此str当做一段javascript代码去执行,如果str执行结果是一个值则返回此值,否则返回undefined.如果参数不是一个字符串,则直接返回该参数,实例如下: eval("var a=1");//声明一个变量a并赋值1. eval("2+3");//执行加运