欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

strcpy, memcpy, memmove, memset的实现

程序员文章站 2024-01-21 13:06:28
...

strcpy() 字符串拷贝

 

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

 

 

memcpy 拷贝不重叠的内存块 

 

void *memcpy(void* pvTo, void* pvFrom, size_t size) //byte是java里的变量类型
{
    assert(pvTo != NULL && pvFrom != NULL);
    byte* pbTo = (byte*)pvTo;
    byte* pbFrom = (byte*)pvFrom;
    /* 内存块重叠吗?如果重叠,就使用memmove */
    assert(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
    while(size-->0)
        *pbTo++ == *pbFrom++;
    return pvTo;
}

 

 

memmove 可拷贝重叠的内存块

 

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个字节设置成字符cvoid * memset(void* buffer, int c, int count)
{
    char* pvTo=(char*)buffer;
    assert(buffer != NULL);
    while(count-->0)
    *pvTo++=(char)c;
    return buffer;
}