在面试中,实现strcpy函数是一个比较常见的考点,但是并不是每个人都能写的完全正确:
第一种写法:
char *my_strcpy(char *dst,const char *src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while((* dst++ = * src++) != '\0')
;
return ret;
}
这种写法注意的了下面几点:
1)指针的有效性的判断
2)返回类型,使得调用参数后让然可以作为坐直,
3)‘\0\也需要复制
但是这种算法的缺陷是,没有考虑两个指针的内存地址重叠的情况,memcpy函数实现时考虑到了内存重叠的情况,可以完成指定大小的内存拷贝
下面是第二种写法,也是正确的写法:
在写程序前要注意下面几点知识:
1)计算机一般为小端存储,即高字节放在高地址,,举例说明如下:
a:int a=0X12345678;12在内存中的地址较高
b:对于数组:char a[]="1234";需要注意的是,1的地址较低,这与数组申请内存有关系。
下面写程序:
char*strcpy(char*target,const char*s,int n)
{
if(s==NULL||target==NULL)
return NULL;
char*temp=target;
if(s>=target||target>s+n)//目标在低地址,或者目标在高地址但是需要复制的那部分没有重合
{
int num=0;
while((* target++ = * s++) != '\0')
{
num++;
if(num>=n)
break;
}
*target= '\0';
}
else
{
s = (char *)s + n - 1;
target=(char*) target+n-1;
*target= '\0';
while(* target-- = * s--)
{
n--;
if(n==0)
break;
}
}
return temp;
}