一些基础函数的实现

1.   memcpy

      函数原型   void * memcpy ( void * destination, const void * source, size_t num );  

(1) 复制指向source位置的num个字节的值直接到指向destination的内存区域中。

(2) source和destination指向的数据类型不用相关,这是二进制复制。

(3) source指向的区域和destination指向的区域不要重叠。

(4) 函数返回destination。

思路一:

void *mymemcpy(void *dst,const void *src,size_t num)  
{  
    assert((dst!=NULL)&&(src!=NULL));  
          
    assert(des>=src+num||src>dst+num);   // 考虑重叠的情况
    byte * psrc = (byte *)src;//byte 既为unsigned char类型  
    byte * pdst = (byte *)dst;  
    while(num-->0)*pdst++ = *psrc++;  
    return dst;  
}  

实现2:考虑重叠,有重叠情况也复制

void * mymemcpy(void *dest, const void *src, size_t count)  
{  
    if (dest == NULL || src == NULL)  
          return NULL;  
    char *pdest = static_cast <char*>(dest);  
    const char *psrc  = static_cast <const char*>(psrc);  
    int n = count;  
      
    if (pdest > psrc && pdest < psrc+count)  
    {  
        for (size_t i=n-1; i != -1; --i)  
        {  
                pdest[i] = psrc[i];  
        }  
    }  
    else  
    {  
        for (size_t i= 0; i < n; i++)  
        {  
                pdest[i] = psrc[i];  
        }  
    }  
      
    return dest;  
}  

3 . 再改进

void *mymemcpy(void *dst,const void *src,size_t num)  
{  
    assert((dst!=NULL)&&(src!=NULL));  
    int wordnum = num/4;//计算有多少个32位,按4字节拷贝  
    int slice = num%4;//剩余的按字节拷贝  
    int * pintsrc = (int *)src;  
    int * pintdst = (int *)dst;  
    while(wordnum--)*pintdst++ = *pintsrc++;  
    while (slice--)*((char *)pintdst++) =*((char *)pintsrc++);  
    return dst;  
}  

 2.   strcmp函数实现:

函数原型:int strcmp(const char *dest, const char *source) ;

返回值:返回整数值,如果dest > source,则返回值大于0,如果dest = source,则返回值等于0,如果dest < source ,则返回值小于0。字符大小是按照字符的字典序列进行排列的。

参数说明:都是以''/0''为结束符的字符串实现;

int strcmp(const char *dest, const char *source)
{
   assert((NULL != dest) && (NULL != source));
   while (*dest && *source && (*dest == *source))
           {
                    dest ++;
                   source ++;
           }
return *dest - *source;

3.  已知strcpy函数的原型是: 
        char * strcpy(char * strDest,const char * strSrc); 

(1)不调用C++/C的字符串库函数,请编写函数 strcpy

char *strcpy(char *strDest, const char *strSrc)

{

    assert((strDest!=NULL) && (strSrc !=NULL));   

    char *address = strDest;                                          

    while( (*strDest++ = * strSrc++) != '\0' )      

              NULL ;

    return address ;                                                

}

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

答:为了实现链式表达式。                                              

例如       int length = strlen( strcpy( strDest, “hello world”) );

4 .   

posted @ 2017-10-19 23:07  爱简单的Paul  阅读(301)  评论(0编辑  收藏  举报