memmove和memcpy 以及strcmp strcpy几个库函数的实现

memmove和memcpy

1.memmove

函数原型:void *memmove(void *dest, const void *source, size_t count)

返回值说明:返回指向dest的void *指针

参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

2.memcpy

函数原型:void *memcpy(void *dest, const void *source, size_t count);

返回值说明:返回指向dest的void *指针

函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

3.两者区别

函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。   
  而memmove(),如果两函数重叠,赋值仍正确进行。

memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy;   
  如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。

memcpy的效率会比memmove高一些,如果还不明白的话可以看一些两者的实现:

memmove

void *memmove(void *dest, void const *src, size_t n)
{
        register char *dp = dest;
        register char *sp = dest;
        if (dp < sp)
        {
                 while(n-- > 0)
                    *dp++ = *sp++;
        }
        else
        {
                 // we should do the copy reversely
                dp += n;
                sp += n;
                while (n-- > 0)
                        *--dp = *--sp;
        }
}  

memcpy

void *memcpy(void *dest, const void *src, size_t count)
{
   char *tmp = dest;
   const char *s = src;

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

strcmp 实现

int  strcmp (    const char * src,      const char * dst       )
{
        int ret = 0 ;

        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                ++src, ++dst;

        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;

        return( ret );
}

strcpy 实现

char* strcpy(char* dest, const char* src)
{
 char* tmp = dest;
 while ((*tmp++ = *src++) != ‘\0‘)
  ;
 return dest;

}
时间: 2024-08-04 11:08:36

memmove和memcpy 以及strcmp strcpy几个库函数的实现的相关文章

[转]memmove、memcpy和memccpy

原文地址:http://www.cppblog.com/kang/archive/2009/04/05/78984.html 在原文基础上进行了一些小修改~ memmove.memcpy和memccpy三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区. memmove(void *dest,void*src,int count) memcpy(void *dest,void *src,int count) memccpy(void*dest,void*src,int ch,int coun

C/C++ memmove 和 memcpy

这两个函数用于拷贝字符串或者一段连续的内存,函数原型: void * memcpy ( void * destination, const void * source, size_t num ); void * memmove ( void * destination, const void * source, size_t num ); 这里有一点需要注意:num指的是需要拷贝的字节数,所以在将void*转型成实际的类型的时候一定要考虑重新计算拷贝的单元数 比如,转成WORD型,则实际需要拷贝

C 实现strcmp,strcpy,strcat函数

基于C语言的strcmp,strcpy,strcat函数的实现.C语言是一个程序员的基础,一定要重视. char* strcat ( char * dst , const char * src ) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ) ; /* Copy src to end of dst *///一直到赋完'\0' return( dst ); /* return

memmove和memcpy

1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返回指向dest的void *指针 参数说明:dest,source分别为目标串和源串的首地址.count为要移动的字符的个数 函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中. 2.memcpy 函数原型:v

C/C++ memmove与memcpy的区别及实现

1.与字符串函数strcpy区别: memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作. memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止. 2.函数说明: memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中. memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmo

memmove 和 memcpy的区别

memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确. 第一种情况

strcmp strcpy的使用 char类型

//判断从控制台输入的密码是否正确 BOOL varifyPassWord(char passWord[] , int index) { BOOL result = YES; int count = 3; char originalPassWord[20] = {0}; strcpy(originalPassWord , allPassWord[index]); //开始判断密码是否一样 while (1) { if (strcmp(originalPassWord , passWord) ==

编写程序实现strlen()函数,strcmp(),strcpy(),strcat()的功能

1.strlen()函数的实现(求字符串长度的函数) #include <stdio.h> #include <assert.h> int my_strlen(const char *str) {   int count=0;   assert(str!=NULL);   while(*str)   {     count++;                 str++;   }   return count; } int main() {   char *string= &qu

内存操作函数memmove,memcpy,memset

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