1. 首先先调用下库函数,看它实现了什么
2. 我们自己实现一个strcpy函数
3. 改进1
把*destnation++和source++
写上去,使用后置++
4. 改进2
这里直接把赋值操作放到了while的判断条件里面,然后while循环语句什么都不做,放了一个空语句(就是一个;)
判断流程是这样的
进入我们的函数之后,直接开始while语句
(1)执行while条件语言,直接将 * source的值赋值给 * destnation 只要这句语句不等于0就一直循环
(2)后置++ 然后一个一个把goodnight的值赋值过去,
(3)最后到‘\0’、相当于*destnation=‘\0’ 就是等于0,此时表达式为假
(4)所以while(表达式为假) 跳出循环 ,并且我们的’\0’也拷贝过去了 。
#define _CRT_SECURE_NO_WARNINGS 1
//模拟实现strlen 函数
#include<stdio.h>
#include<string.h>
void my_strcpy(char *destnation,char* source)
{
while (*destnation++ = *source++)
{
;
}
}
int main()
{
char str1[10] = { 0 };
char str2[] = "goodnight";
my_strcpy(str1, str2);
printf("%s", str1);
return 0;
}
调试,可以在局部变量看,也可以在内存窗口看str1的变化。
5.改进3
加入assert
#include <assert.h>
void my_strcpy(char* dest, char* src)
{
/*if (src == NULL || dest == NULL)
{
return;
}*/
//断言
//assert中可以放一个表达式,表达式的结果如果为假,就报错,如果为真啥事都不发生
//assert 其实在release版本中优化了
/*assert(src != NULL);
assert(dest != NULL);*/
assert(dest && src);
while (*dest++ = *src++)
{
;
}
}
void my_strcpy(char* dest, char* src)
{
assert(dest && src);//断言指针的有效性
while (*dest++ = *src++)
{
;
}
}