天天看点

面试题五答案

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

继续阅读