当前位置:网站首页>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函数优化的最终版本了,喜欢的点个小红心,关注一下,下期更精彩.
边栏推荐
猜你喜欢
随机推荐
【ICDE 2022】阿里发布稀疏模型训练框架HybridBackend,单位成本下训练吞吐提升至5倍
String为什么是不可变的?
#23-5 OJ 86 杨辉三角形
C语言中的 pow 函数 使用方法及注意事项,和常见报错原因,且分享实战中的使用
小程序开发制作成本是多少?三种开发方法成本分析!
【翠花学习单例模式】项目框架升级之单例模式及统一异常处理
11. cuBLAS Development Guide Chinese version--Level-1 functions amax() and amin() in cuBLAS
预约直播 I 阿里云EMR StarRocks 产品发布会
几种常见路由类型及其优先级
阿里云发布中国云原生数据湖应用洞察白皮书
Shell course summary
汇编语言学习(四)
小程序程序开发怎么做?应以突出功能为主
GridContainer of openharmony container component
RHCE课程总结
C语言 交换两个变量(不创建临时变量) 代码详解
vs how to use a Button to link to another page
现实版商战:“武功再高,也怕菜刀”
Dry+Bean+Dataset R language data analysis, report in English
蓝桥杯嵌入式(STM32F103RBT6)最全攻略(一)









