天天看點

面試題五答案

1、重寫strcpy函數

     原型聲明:extern char *strcpy(char *dest,const char *src);

     功能:把從src位址開始且含有NULL結束符的字元串指派到以dest開始的位址空間

     傳回:傳回指向dest的指針

     實作:char * strcpy(char * strDest,const char * strSrc)

               {

                       char* CopyDest=dest;

                       if(dest==null||src==null) throw "invalid argument";

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

                       return CopyDest;

               }

      傳回strDest的原始值使函數能夠支援鍊式表達式,增加了函數的“附加值”。同樣功能的函數,如果能合理地提高的可用性,自然就更加理想。

2、重寫memcpy函數

     原型聲明:void *memcpy(void *dest, const void *src, size_t n);

     功能:從源src所指的記憶體位址的起始位置開始拷貝n個位元組到目标dest所指的記憶體位址的起始位置中

     傳回值:dest值

     實作:

       void  *memcpy(void *dest, const void *src, size_t size) {   //要拷貝的源,即const void* src,應該是用const的,避免有意或無意的修改

                   assert((dest!= NULL) && (src!= NULL));      // 使用斷言

                   byte*pbTo = (byte *) dest;         // 防止改變dest的位址

                   byte*pbFrom = (byte *) src; // 防止改變src的位址

                   while(size-- > 0 )

                           *pbTo++= *pbFrom++ ;

                  return pvTo;

         }

     最常見的寫法:

   void* memcpy( void* dest, const void* src, size_t count ) 

   { 

     if (count<0) 

    {   

         printf("Invalid count number !.\n"); 

        return (void*)0;

      } 

      if(src==NULL || dest==NULL) 

          return (void*)0 ; 

      if ((unsigned int)dest==(unsigned int)src) 

      {

         printf("The source is equal with the destanation!.\n"); 

         return dest;

     } 

     char* d = (char*)dest;

     const char* s = (const char*)src; 

     while(count--) *d++ = *s++; 

     return dest; 

  }

3、strcpy和memcpy主要有以下3方面的差別。

  1)、複制的内容不同。strcpy隻能複制字元串,而memcpy可以複制任意内容,例如字元數組、整型、結構體、類等。   2)、複制的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符"\0"才結束,是以容易溢出。memcpy則是根據其第3個參數決定複制的長度。   3)、用途不同。通常在複制字元串時用strcpy,而需要複制其他類型資料時則一般用memcpy

繼續閱讀