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,若涉及版权问题,通知本人后立即删除。
浙公网安备 33010602011771号