在实现strcpy之前我们必须了解strcpy的源函数
char* strcpy(char* dest, const char* src)
作用:
1.把source的源字符串,拷贝到目标空间的过程
2.源字符串必须以’\0’作为结束
3.同时也会将源字符串中的’\0’拷贝到目标空间
注意:
1我们可以看到strcpy的返回值不是void而是char
2.scr源函数前面有个const
在实现的时候的我们最先能想到的代码
void my_strcpy(char* dest, char* scr)
{
while (*scr)
{
*dest++ = *scr++;//每次拷贝两个指针都向后移动.
}
*dest = *scr;//这一句是为了拷贝'\0'
}
但是,经过优化会有下面这段代码,两个含义一样
void my_strcpy(char* dest, char* scr)
{
while (*dest++=*scr++)//这里每次以scr传给des的值作为判断条件,什么时候传到0,什么时候停止.也保证了'\0'也传过去了
{
;
}
}
但这段函数我们是在传指针,如果指针为空会很麻烦,所以这里我们新介绍一个assert的库函数,assert的作用就是当传入空指针的时候会报错
同时我们发现源代码的返回值是char*
char* my_strcpy(char* dest, const char* scr)
{
char* ret = dest;//保存dest最初的位置用于最后返回
assert(dest != NULL);
assert(scr != NULL);
while (*dest++ = *scr++)
{
;
}
return ret;
}
由const引起的小知识点:
1.
const char *p = "abcdef"; //指向常量的指针,不允许改变指针指的内容
char* const p = "abcdef";//常指针,不能改变指向
char* p1 = NULL;
const char* p2 =NULL;
p1 = p2;//不可以赋值
p2 = p1;//可以赋值
原因:可以高权限往低权限赋值,但不能低权限往高权限赋值.
因为 p1可以修改(高权限),而p2因为const的限制不能修改内容(低权限)
,所以p1可以赋给p2,反之则不行