当前位置:网站首页>Simulate the realization of strcpy function (including multiple optimization ideas)
Simulate the realization of strcpy function (including multiple optimization ideas)
2022-08-09 14:48:00 【GD_small_bit】
我今天为大家带来strcpy函数的自主实现,话不多说,直接开始.
声明:下面对strcpy函数说明而截取的图片,来自于软件MSDN
strcpy函数的介绍
我们观看下面这张图片(来自软件MSDN)
点开MSDN软件,再点击索引,并且在下面边框中搜索strcpy来了解strcpy函数的作用,往下面翻,找到解析该函数的句子,如下:
翻译过来就是,strcpy将strSource,包括终止符号(\0),复制到strDestination,而strSource和strDestination是第一张图的一些内容,如下:
通过上面的分析,我们大致知道了strcpy的作用,接下来,我们来尝试实现这个函数.
简单实现strcpy函数
我们创建字符数组,并且通过指针来实现strcpy函数.
#include<stdio.h>
void my_strcpy (char* arr1,char* arr2)
{
while(*arr2!='\0')
{
//注意是后置加加
*arr1++ = *arr2++;
}
//拷贝\0
*arr1 = *arr2;
}
int main ()
{
char arr1[] = "*******************";
char arr2[] = "hello world";
my_strcpy(arr1,arr2); //我们要实现arr2拷贝到arr,仿造库函数strcpy把arr2放在arr1后面
printf("%s\n",arr1); //打印arr1观察拷贝结果
return 0;
}
拷贝内容和拷贝\0同时进行
由于上面一个程序的代码实行下,拷贝内容和拷贝\0是分开进行的,我们在这个地方进行优化.
#include<stdio.h>
void my_strcpy (char* arr1,char* arr2)
{
//当拷贝\0完成后,返回0,判断为假,循环结束
while(*arr1++ = *arr2++)
{
;
}
}
int main ()
{
char arr1[] = "*******************";
char arr2[] = "hello world";
my_strcpy(arr1,arr2); //我们要实现arr2拷贝到arr,仿造库函数strcpy把arr2放在arr1后面
printf("%s\n",arr1); //打印arr1观察拷贝结果
return 0;
}
strcpy函数的深度解析1

由上面的图片我们可以了解到,被拷贝的字符数组前面加上了const,而被覆盖的字符数组却没有,接下来,我们要了解const的作用.
函数const是关键字,赋予不可改变性.
const加在了strsource前面,防止在实行strcpy库函数时,将源头修改.
由此可见,我们的代码也进行优化.
#include<stdio.h>
//赋予源头不可改变性,防止*arr1++和*arr2位置写错导致错误
void my_strcpy (char* arr1,const char* arr2)
{
//当拷贝\0完成后,返回0,判断为假,循环结束
while(*arr1++ = *arr2++)
{
;
}
}
int main ()
{
char arr1[] = "*******************";
char arr2[] = "hello world";
my_strcpy(arr1,arr2); //我们要实现arr2拷贝到arr,仿造库函数strcpy把arr2放在arr1后面
printf("%s\n",arr1); //打印arr1观察拷贝结果
return 0;
}
strcpy函数的深度解析2

由图片可以知道,strcpy库函数是有返回值的,所以我们在模拟strcpy函数的需要设定返回值.
#include<stdio.h>
//赋予源头不可改变性,防止*arr1++和*arr2位置写错导致错误
char* my_strcpy (char* arr1,const char* arr2)
{
//开头保存arr1,因为后面arr1不再是首元素地址
char* ret = arr1;
//当拷贝\0完成后,返回0,判断为假,循环结束
while(*arr1++ = *arr2++)
{
;
}
return ret;
}
int main ()
{
char arr1[] = "*******************";
char arr2[] = "hello world";
printf("%s\n",my_strcpy(arr1,arr2)); //打印arr1观察拷贝结果
return 0;
}
引入断言assert
我们还需要考虑我们的strSource和strDestination不能被传入空指针,引用assert可以及时报出错误.
#include<stdio.h>
#include<assert.h>
//赋予源头不可改变性,防止*arr1++和*arr2位置写错导致错误
char* my_strcpy (char* arr1,const char* arr2)
{
char* ret;
assert(arr1!=NULL);
assert(arr2!=NULL);
//开头保存arr1,因为后面arr1不再是首元素地址
ret = arr1;
//当拷贝\0完成后,返回0,判断为假,循环结束
while(*arr1++ = *arr2++)
{
;
}
return ret;
}
int main ()
{
char arr1[] = "*******************";
char arr2[] = "hello world";
printf("%s\n",my_strcpy(arr1,arr2)); //打印arr1观察拷贝结果
return 0;
}
这个便是最终的strcpy函数优化的最终版本了,喜欢的点个小红心,关注一下,下期更精彩.
边栏推荐
猜你喜欢

*5-2 CCF 2014-12-3 集合竞价

Using the NVIDIA Kaolin Wisp reconstruction of 3 d scene

阿里云PAI与香港大学合作论文入选INFOCOM 2022,有效减少大规模神经网络训练时间

三种ThreadLocal,玩转线程变量保存与传递

System Scalability Thinking

Thinking about oracle financial data authority

【ClickHouse】 日志清理方法(query_log、query_thread_log)

*4-2 CCF 2014-12-2 Z字形扫描

Zero Basic Learning CANoe Panel Design Catalog

Where to go to IOE-EBS
随机推荐
微信小程序getPhoneNumber接口code=40013
【ClickHouse】 日志清理方法(query_log、query_thread_log)
源码编译安装LAMP
shell课程总结
使用 NVIDIA Kaolin Wisp 重建3D场景
*2-3 OJ 1164 导弹拦截之升级版
C语言中常用的数组排序方法:冒泡排序、选择排序、插入排序、数组的移动(含代码详解)以及相关联系题
曾毓群想做王传福
*3-3牛客网 重新排列
*5-1 CCF 2015-03-1 图像旋转
“未来10年,中国APP不可能回印度了”
Talking about CQRS Mode
汇编语言学习(四)
*2-4 每日温度 *2-5 接雨水
华为ensp静态路由、DHCP
idea安装
关于舵机的漂移与不听指挥乱动的问题
add-apt-repository命令详解
RHCE课程总结
预约直播 I 阿里云EMR StarRocks 产品发布会