memcpy,memmove,memset函数福彩3D平台搭建用法及实现

一.函数介绍:福彩3D平台搭建论坛:haozbbs.com Q1446595067
1、memcpy
函数原型:extern void memcpy(void dest, const void *src, size_t count);
用法:#include<string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
注意:和strcpy相比,memcpy不是遇到’/0’就结束,而是一定会拷贝完n个字节。

函数实现代码:

void memcpy(void dest, const void *src, size_t count)
{

 assert(dest!=NULL&&src!=NULL);
 char *tmp = dest;
 const char *s = src;

 while (count--)
 *tmp++ = *s++;
 return dest;

}

2、memset
函数原型:extern void memset(void s, int c, size_t n)
功能:将已开辟内存空间s的首n个字节的值设为值c。将s中的前n个字符替换为c,并返回s。
memset常用于内存空间的初始化。
memset的深刻内涵:用来对一段内科空间全部设置为某个字符,一般用在对定义的字符串进行初始化为:memset(a, ‘/0’, sizeof(a));

函数实现代码:

void memset(void buffer, int c, int count)
{
char buffer_p=(char)buffer;
assert(buffer != NULL);
while(count-->0)
*buffer_p++=(char)c;
return buffer;
}

3、memmove

void memmove(void s, const void *ct, size_t n)
与memcpy类似,所不同的是,当对象重叠时,该函数仍能正确执行,具体的实现代码在下面有详细解释。

4、strncpy
函数原型:extern char strncpy(char dest, char *src, int n);
用法:#include <string.h>

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针(该指向dest的最后一个元素)
实现代码:

char strncpy(char dest,const char src,size_t count)
{
char
tmp = dest;
while (count-- && (dest++ = src++) != ‘/0‘)
/ nothing /;
return tmp;
}

5、strcpy:

函数原型:extern char strcpy(char dest,char *src);

头文件:string.h

功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。如果src的结尾不是‘/0‘的话,那么系统会在src的结尾处自动加一个‘/0‘。例如:

#include <stdio.h>
#include <string.h>

void main()
{
char array1[5]={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘};
char array2[5]={‘a‘,‘b‘,‘c‘};
strcpy(array1,array2);
printf("%s/n",array1);
}

输出结果:abc

函数实现代码:

char strcpy(char strDest, const char strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL));
char
address = strDest;
while( (strDest++ = strSrc++) != ‘/0‘)
NULL ;
return address ;
}

二.下面重点来讲解memcpy和memmove的区别:
这两个函数的函数原型(除了名字)是一样的:
void memcpy(void dst, const void src, size_t count):
void
memmove(void dst, const void src, size_t count);
它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果都是一样的。但有交叉时不一样。源内存和目标内存交叉的情况有以下两种:(左边为低地址)

即:dst<=src 且 dst+count>src

即:src<dst且src+count>dst
下面将针对这两种情况来讨论。针对第一种交叉情况情况,dst<src且dst+count>src,memcpy和memmove的结果是一样的。请看下面的例子讲解:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a, a+4, sizeof(int)6);和memmove(a, a+4, sizeof(int)6);结果是:
4567896789

针对第二种情况,src<dst且src+count>dst,memcpy和memmove的结果是不一样的。请看下面的例子:
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(a+4, a, sizeof(int)*6)

memmove(a+4, a, sizeof(int)*6)

下面是这两个函数的具体实现:

void memcpyMy(void dst, const void *src, size_t count)

{
void *address = dst;

   while (count)
  {
       *(char *)address = *(char *)src;
       address = (char *)address + 1;
       src = (char *)src + 1;
       count --;
   }

   return dst;

}

void memmoveMy(void dst, const void *src, size_t count)

{
void *address = dst;

   if (dst <= src || (char*)dst >= (char *)src + count)
  {
        while (count --)
       {
            *(char *)address = *(char *)src;
            address = (char *)address + 1;
            src = (char *)src + 1;
        }
   }

   else

  {
       address = (char *)address + count - 1;
       src = (char *)src + count - 1;
       while (count --)
       {
            *(char *)address = *(char *)src;
            address = (char *)address - 1;
            src = (char *)src - 1;
        }
   }

   return dst;

}
以上两段代码是在vc6.0下通过测试的。

原文地址:http://blog.51cto.com/13855505/2137007

时间: 2024-10-10 17:37:44

memcpy,memmove,memset函数福彩3D平台搭建用法及实现的相关文章

走进C标准库(7)——"string.h"中函数的实现memcmp,memcpy,memmove,memset

我的memcmp: 1 int memcmp(void *buf1, void *buf2, unsigned int count){ 2 int reval; 3 while(count && !(reval = (*(unsigned char *)buf1) - (*(unsigned char *)buf2))) 4 { 5 buf1 = (unsigned char *)buf1 + 1; 6 buf2 = (unsigned char *)buf2 + 1; 7 --count

C语言 strcpy,memcpy,memmove,memccpy函数

1.原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字符串复制到dest所指的数组中. 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针. 2.原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include &l

模拟实现部分库函数(strcpy,strcmp,strcat,strstr,memcpy,memmove,memset)

//1.strcpy(拷贝) char* my_strcpy(char*dst, const char*src) {  assert(dst);  assert(src);  char* cp = dst;  while (*cp++ = *src++)  {   ;  }  return dst; } //2.strcat(连接) char* my_strcat(char*dst, const char*src) {  assert(dst);  assert(src);  char* cp 

strcpy, memcpy, memset函数

一. strcpy函数 原型声明:char *strcpy(char* dest, const char *src); 头文件:#include <string.h> 和 #include <stdio.h> 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针. 实现代码: char * strcpy(char * strDest,c

内存操作函数memmove,memcpy,memset

通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作函数,当然也 不能一个一个复制,所以就引入了内存操作函数. memcpy函数原型: void *memcpy(void *dst, const void *src, size_t size);将一块内存的数据复制到另一块内存.当两块内存重叠              的时候,memcpy就不能保证拷

strcpy,memcpy,memset函数实现

strcpy 实现,只能拷贝字符串 char* strcpy(char* des,const char* source) { char* r=des; assert((des != NULL) && (source != NULL)); while((*des++ = *source++)!='\0'); return r; } memcpy 实现,注意目的地址和源地址重合的情况,以及强制类型转换 void *myMemCopy(void *dest,const void *src,siz

C语言学习笔记---好用的函数memcpy与memset

这个主要用于我个人的学习笔记,便于以后查询,顺便分享给大家. 想必在用C的时候难免会与数组,指针,内存这几样东西打交道,先以数组为例,例如有一个数组int a[5] = {1, 2, 3, 4, 5},我们要将数组a里面的数据复制到数组b中,一般刚刚接触C语言的我们会怎么做?我们一般会想到用循环来做吧 1 int i; 2 int a[5] = {1, 2, 3, 4, 5}, b[5]; 3 4 for(i = 0; i < 5; i++) 5 { 6 b[i] = a[i]; 7 } 但是,

memset memcmp memcpy memmove 自己实现

memset memcmp memcpy memmove 自己实现 memset #include <stdio.h> #include <memory.h> #include <assert.h> void* my_memset(void* dest, int c, size_t cnt){ assert(NULL != dest); char *a = (char*)dest; while(cnt-- > 0){ *a++ = c; } return dest

dubbo源码福彩快三平台搭建分析22 -- consumer 发送与接收原理

在前面福彩快三平台搭建论坛:haozbbs.com Q1446595067的文章中,我们分析了 dubbo 从 provider 进行服务暴露,然后把服务信息注册到注册中心上面解耦 consumer 与 provider 的调用.consumer 通过 javassist 创建代理对象引用远程服务.当通过代理对象调用远程服务的时候,讲到进行真正调用的时候 dubbo 抽象出集群容错(Cluster.Directory.Router.LoadBalance)从服务多个暴露方选取出一个合适的 Inv