1.先用数组的做法
void Mystrcpy1(char *des,char *src)
{
int i;
for(i=0;src[i]!='\0';i++)
{
des[i] = src[i];
}
des[i] = '\0';
}
{
int i;
for(i=0;src[i]!='\0';i++)
{
des[i] = src[i];
}
des[i] = '\0';
}
2.也可以用指针的方法
void Mystrcpy2(char *des,char *src)
{
while(*src != '\0')
{
*des = *src;
src++;
des++;
}
*des = '\0';
}
{
while(*src != '\0')
{
*des = *src;
src++;
des++;
}
*des = '\0';
}
3.又因为中括号自带解引用的效果,即*(arr+i)==arr[i]; p[i]==*(p+i),所以指针也可以有如下方法。
void Mystrcpy3(char *des,char *src)
{
int i;
for(i=0;*(src+i)!='\0';i++)
{
*(des+i) = *(src+i);
}
*(des+i) = '\0';
}
void Mystrcpy3(char *des,char *src)
{
int i;
for(i=0;*(src+i)!='\0';i++)
{
*(des+i) = *(src+i);
}
*(des+i) = '\0';
}
4.结合2.3.方法 可以将字符串复制指针做法化简为一步渠成: while(*des++ = *src++)。即
void Mystrcpy4(char *des,char *src)
{
while(*des++ = *src++) ;
}
{
while(*des++ = *src++) ;
}
5.将4进行优化,加上断言,它的作用是断定该结果一定成立,如果表达式为真则忽略,否则程序崩溃。
void Mystrcpy5(char *des,char *src)
{
assert(des!=NULL && src!=NULL);
if(des==NULL || src==NULL)
{
return ;
}
{
assert(des!=NULL && src!=NULL);
if(des==NULL || src==NULL)
{
return ;
}
while(*des++ = *src++) ;
}
}
6.因为返回值的作用是返回的是目前字符串的首地址,所以可以再次优化,先定义一个char*p,最后返回p即可。
char *Mystrcpy6(char *des,char *src)
{
char *p = des;
assert(des!=NULL && src!=NULL);
if(des==NULL || src==NULL)
{
return NULL;
}
{
char *p = des;
assert(des!=NULL && src!=NULL);
if(des==NULL || src==NULL)
{
return NULL;
}
while(*des++ = *src++) ;
return p;
}
}
以目前所学知识来看,第六个是目前最好且最安全的复制字符串的做法。