拷贝一个字符串到另一个字符串里面
我们先创建两个字符串
int main()
{
char arr1[20] = "xxxxxxxxxxxx";
char arr2[] = "hello world";
return 0;
}
要求
将arr2的数据全部传输到arr1里面
我们分析一下
可以使用两个指针分别指向arr1 和 arr2
每次讲arr2的值赋值给arr1之后两个指针向前走一下
终止的条件是遇到‘\0’
在遇到‘\0’停止之后再下面可以再赋值一次
代码如下
这个代码可以
void my_strcpy(char* des, char* cpy)
{
while (*cpy!='\0')
{
*des = *cpy;
des++;
cpy++;
}
*des = *cpy;
}
int main()
{
char arr1[20] = "xxxxxxxxxxxx";
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
这个代码可以拿到60分
那我们可以怎么开始进行优化呢?
我们说后置++可以配合解引用一起使用
这样子修改
void my_strcpy(char* des, char* cpy)
{
while (*cpy!='\0')
{
*des++ = *cpy++;
}
*des = *cpy;
}
经过这么修改之后这个代码可以拿到70分
那还有没有可以优化的地方呢?
答案还是有的
我们可以把它的赋值放到while循环里去
因为当*cpy为‘0’的时候实际上它的ascll码值也是0
此时while循环终止
void my_strcpy(char* des, char* cpy)
{
while (*des++ = *cpy++)
{
;
}
}
经过这样子的修改之后 这个函数可以拿到80分
那么还有没有可以优化的地方呢?
答案是有的
有时候如果我们输入cpy是一个空指针的时候 程序就会崩溃
这时候我们就需要一段代码来判断cpy是不是一个空指针
那就要介绍一下我们的assret()断言函数了
assert()断言
如果括号内部的条件是错的就会报错
只在debug版本下有效
再release版本中失效
于是我们写下这段代码
#include<assert.h>
void my_strcpy(char* des, char* cpy)
{
assert(cpy != NULL);
while (*des++ = *cpy++)
{
;
}
}
经过这样子的修改 这段代码可以拿到90分!
那么还可不可以做更进一步的优化呢?
答案是可以的
有些时候我们可能讲目的地和需要赋值的内容搞反了 从而造成各种意想不到的错误
因此我们可以讲需要复制的内容用const修饰
这样子就可以避免出现上面的错误啦
代码表示如下
#include<assert.h>
void my_strcpy(char* des,const char* cpy)
{
assert(cpy != NULL);
while (*des++ = *cpy++)
{
;
}
}
那么我们可以说 这段代码可以拿到99分
最后一点小细节呢就是我们的库函数是有返回值的 最后设定一个返回值就编程一个完美的strcpy函数啦
char* my_strcpy(char* des, const char* cpy)
{
assert(cpy != NULL);
while (*des++ = *cpy++)
{
;
}
return (des);
}
int main()
{
char arr1[20] = "xxxxxxxxxxxx";
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
这就是strcpy的完美实现方式
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯