#include <stdio.h>
// first edition
void my_strcpy(char* dest, char* src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
}
int main()
{
char arr1[20] = "123456789";
char arr2[] = "fami";
my_strcpy(arr1, arr2); //1. 目标空间的起始地址;2. 源空间的起始地址
printf("%s\n", arr1);
return 0;
}
优化1:使代码更加简洁
void my_strcpy(char* dest, char* src)
{
while (*dest++ = *src++)
{
//do nothing;
}
}
优化2:源空间的起始地址加 const 修饰 -> 防止使用 my_strcpy() 函数时,将参数顺序弄反
//将src指向的内容放到dest指向的空间中
//希望dest指向的内容被修改,而src指向的内容不被修改
void my_strcpy(char* dest, const char* src)
{
while (*dest++ = *src++)
{
//do nothing;
}
}
优化3:使用 assert -> 防止传入的地址为 NULL
#include <assert.h>
void my_strcpy(char* dest, const char* src)
{
assert(dest != NULL); // 断言:若不满足断言的条件,则程序运行到断言处终止
assert(src != NULL);
while (*dest++ = *src++)
{
//do nothing;
}
}
优化4:库函数strcpy 返回的是目标空间的起始地址
// 模拟实现 strcpy
#include <stdio.h>
#include <assert.h>
// final edition
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL); // 断言:若不满足断言的条件,则程序运行到断言处终止
assert(src != NULL);
char* ret = dest;
while (*dest++ = *src++)
{
//do nothing;
}
return ret;
}
int main()
{
char arr1[20] = "123456789";
char arr2[] = "fami";
//my_strcpy(arr1, arr2); //1. 目标空间的起始地址;2. 源空间的起始地址
printf("%s\n", my_strcpy(arr1, arr2)); // 链式访问
return 0;
}