C知识点—字符串复制

1、字符串复制

    ->描述

    编写一个函数。实现类似strcpy的字符串复制函数。原型定义为char*mystrcpy(char*dest,char*src)。功能是把src所指向的字符串复制到dest所指的数组中,返回dest指针。提示:src和dest所指的内存区域有可能重叠。

   

char* mystrcpy(char* dest,char* src)
{
   char* p=dest;
   while(*src!='\0')
   {
      *dest++=*src++;
   }
   return p;
}

   上述代码实现了程序的基本功能,但与一些企业的期望还有较大差距,因为还有一些特殊的因素没有考虑到。

    1>对输入参数的合法性检测:如果参数dest或src指针有一个是空指针(指针等于NULL),那么就无法完成字符串复制的工作,应该提前退出。不应该继续执行。

    2>内存区域重叠的问题:

        1、dest<=src  

        2、dest>=src+count

        对于上述1、2种情况对于字符串从src区域复制到dest区域是完全可以通过上述代码实现的。 

        3、src<dest<src+count)

        对于第3种如果按照上述代码实现,那么肯定会出现内存重叠,也就是说当复制到一定程度时,之前复制过的字符串会被后面复制的字符串重叠。这时候就必须采取其他办法来实现字符串的正确复制。我们可以从src指向字符串的最后一个字符开始复制,即从后往前进行复制,这样就不会出现之前复制的字符在后面复制中被覆盖的情况。

        

char* mystrcpy(char* dest,char* src)
{
    char* d=dest;//输入参数的备份
    char* s=src;
    int count=0;
    assert(dest);//指针的合法性检查
    assert(src);
    if(src==dest)
    {
        return src;
    }
    count=strlen(src)+1;//计算src字符串的长度
    if(count<=1)
    {
        return 0;//说明src字符串内容为空
    }
    if(dest<src||dest>=(src+count))
    {
        while(count--)
        {
           *d++=*s++;
        }
    }
    else
    {
         d=dest+count;
         s=src+count;
         while(count--)
         {
             *d--=*s--;
         }
    }
    return dest;
}

 

备注:本文大部截取自《经典C面试真题精选》pg12,若涉及版权问题,通知本人后立即删除。

posted @ 2014-11-14 17:42  普雅花郎  阅读(986)  评论(0)    收藏  举报