理解strcpy
实现
废话不多说,先上实现的代码~
char * strcpy(char *to, const char *from)
{
assert(to != NULL && from != NULL)
char *p = to;
while((*p++ == *from++) != '\0')
;
return to;
}
说明
- 源字符串from用
const
修饰,防止被修改 空指针
检查,保证代码的健壮性- 返回目标地址
- 返回
char *
是因为,返回to的原始值使函数能够支持链式表达式,如:int l=strlen(strcpy(strA,strB));
to from 内存重叠处理
比如:
char s[10]="nihao";
strcpy(s, s+1); //应返回ihao
//strcpy(s+1, s); //应返回nnihao,但实际会报错,`因为to与from重叠了,把'\0'覆盖了`
所谓重叠,就是from未处理的部分已经被to给覆盖了,只有一种情况:from<=to<=from+strlen(from)
解决
实现memcpy函数,检查内存再做拷贝.
#include<stdio.h>
#include<string.h>
#include<assert.h>
char *strcpy(char *to, const char *from){
assert(to != NULL && from != NULL);
char *p = to;
memcpy(to,from,strlen(from)+1);
return p;
}
char *memcpy(char *to, char *from, int count)
{
assert(to != NULL && from != NULL);
char *res = to;
if(to >= from && to <= from+count-1)
{
from = from + count - 1;
to = to + count - 1;
while(count--)
{
*to-- = *from--;
}
}
else
{
while(count--)
{
*to++ = *from++;
}
}
return res;
}
int main(){
char a[20]="yixiaojia";
strcpy(a+1,a); //yyixiaojia
// strcpy(a, a+1); //ixiaojia
printf("%s\n", a);
return 0;
}