zoukankan      html  css  js  c++  java
  • 一些基础函数的实现

    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++) != '' )      

                  NULL ;

        return address ;                                                

    }

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

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

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

    4 .   

  • 相关阅读:
    如何更高效(HOWTO: Be more productiveAaron Swartz)
    这事儿太丢人了
    2012年终极心愿之每月培养一个好习惯
    【转载】SQLLite使用入门
    【原创】XNA 4.0学习笔记之如何使用XACT给Cue添加多个音频
    【原创】编程日记之——如何对DataSet进行强类型化
    【索引】Win7 操作系统编程常识
    [原创]怎么降低Winform程序占用的内存
    【原创】自制Winform标签控制控件[支持不规则窗体]
    【原创】XNA 4.0学习笔记之绘制基元图形的几种PrimitiveType区别[PS:4.0似乎有所改动]
  • 原文地址:https://www.cnblogs.com/simplepaul/p/7696114.html
Copyright © 2011-2022 走看看