strcpy()、memcpy()、memmove()、memset()的实现

作者在 2009-03-04 17:49:08 发布以下内容
一直想知道 strcpy()、memcpy()、memmove()、memset()的内部实现

strcpy(), 字符串拷贝.
char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest!=NULL) && (strSrc !=NULL));
    char *address = strDest;   
    while( (*strDest++ = * strSrc++) != '\0')
  NULL ;
    return address ;     
}
memcpy, 拷贝不重叠的内存块
void *memcpy(void* pvTo, void* pvFrom, size_t size) //byte是java里的变量类型
{
 assert(pvTo != NULL && pvFrom != NULL);
 void* pbTo = (byte*)pvTo;
 void* pbFrom = (byte*)pvFrom;
 /* 内存块重叠吗?如果重叠,就使用memmove */
 assert(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
 while(size-->0)
  *pbTo++ == *pbFrom++;
 return pvTo;
}
void *MemCopy(void *dest,const void *src,size_t count)
{
    char *pDest=static_cast<char *>(dest);
    const char *pSrc=static_cast<const char *>(src);
    if( pDest>pSrc && pDest<pSrc+count )
    {
        for(size_t i=count-1; i<=0; ++i)
        {
            pDest[i]=pSrc[i];
        }
    }
    else
    {
        for(size_t i=0; i<count; ++i)
        {
   pDest[i]=pSrc[i];
        }
    }
    return pDest;
}
void *Memmove(void *Dst, const void*Src,size_t count)
{
 assert(Dst && Src);
 void* pDst = Dst;
 if (Dst<Src && (char*)Dst > (char*)Src + count)
 {
  while(count--)
  {
   *(char*)Dst = *(char*)Src;
   Dst = (char*)Dst + 1;
   Src = (char*)Src + 1;
  }
 }
 else
 {
  Dst = (char*)Dst + count - 1;
  Src = (char*)Src + count - 1;
  while(count--)
  {
   *(char*)Dst = *(char*)Src;
   Dst = (char*)Dst -1 ;
   Src = (char*)Src -1 ;
  }
 }
 return pDst;
}

void* memmove(void *dest, const void *src,size_t n)
{
    if (n == 0) return 0;
    if (dest == NULL) return 0;
    if (src == NULL)    return 0;
    char *psrc = (char*)src;
    char *pdest = (char*)dest;
    if((dest <= psrc) || (pdest >= psrc + n)) /*检查是否有重叠问题 */
 {
  for(int i=0; i < n; i++) /*正向拷贝*/
  {
   *pdest = *psrc;
   psrc++;
   pdest++;
  }
 }
 else /*反向拷贝*/
 {
  psrc += n;
  pdest += n;
  for(int i=0;i<n;i++)
  {
            psrc--;
            pdest--;
            *pdest = *psrc;
  }
 }
 return dest;
}
memset把buffer所指内存区域的前count个字节设置成字符c
void * Memset(void* buffer, int c, int count)
{
 char* pvTo=(char*)buffer;
 assert(buffer != NULL);
 while(count-->0)
  *pvTo++=(char)c;
 return buffer;
}
基础知识 | 阅读 7827 次
文章评论,共1条
vfdff(作者)
2009-03-06 08:20
1
memset(),memcpy(),memccpy(),memmove(),bcopy(),strcpy(),strncpy()<br />
<br />
void *memset(void *s,int c,int strlen);<br />
void *memcpy(char *str_d,char *str_s,int n);<br />
void *memccpy(void *dest,const void *src,int c,int n);<br />
void *memmove(void *dest,const void *src,int n);<br />
void bcopy(const void *src,void *dest,int n);<br />
char *strcpy(char *dest,const char *src);<br />
char *strncpy(char *dest,const char *src,int strlen);<br />
<br />
以上的函数是我们在c编程中经常遇到的,下面是对每个函数的简单解释:<br />
void *memset(void *s,int c,int n)<br />
用c填充由指针s指向的内存区域的前n个字节.返回指向该内存区域的指针s.s并不一定是指向字符的指针,他可以是指向任何类型的指针,甚至可以是指向结构的指针.<br />
<br />
void *memcpy(void *dest,const void *src,int n);<br />
<br />
将指针src指向的前n个字节拷贝到dest指向的前n个内存区域中。如果src和dest有重复区域,则会被覆盖.即在拷贝的过程中向后移.这样可能达不到预期的效果.<br />
<br />
void *memmove(void *dest,const void *src,int n)<br />
<br />
该函数和前面函数的区别是当src和desc有重复区域时,则会先将desc向后移,然后再进行拷贝操作.<br />
<br />
void *memccpy(void *dest,const void *src,int c,int n);<br />
<br />
 The memccpy() function copies no more than n bytes from memory area src to memory area dest, stopping when the character c is found.<br />
 <br />
返回结果是一个指向dest中的第一个c后面的字符,如果在src的前n个字符中没有找到c,则返回NULL<br />
<br />
void bcopy(const void *src,void *dest,int n);<br />
从src拷贝n个字节到dest中.如果n=0,则拷贝0个字节<br />
<br />
所有上面的拷贝是针对任何数据类型的,所以指针类型都是void类型.而下面的strcpy和strncpy都是针对字符串的操作.<br />
<br />
char *strcpy(char *dest,const char *src);<br />
把src指针指向的字符串拷贝到dest指向的数组中,包括.不能处理区域重复的问题,但是dest指向的空间必须比src的空间大.<br />
<br />
char *strncpy(char *dest,const char *src,int n)<br />
<br />
把src指向的字符串的前n个字符拷贝到dest指向的数组中,如果src的前n个字符中没有结束符,则dest也没有.这样不是正确的做法.<br />
<br />
返回值是指向字符串的指针.如果dest的长度不够,则会有溢出错误.
游客请输入验证码
浏览1970472次