当前位置:网站首页>模拟实现strcpy函数的实现(含多次优化思想)
模拟实现strcpy函数的实现(含多次优化思想)
2022-08-09 13:32: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函数优化的最终版本了,喜欢的点个小红心,关注一下,下期更精彩。
边栏推荐
猜你喜欢
随机推荐
RHCE课程总结
Mysql seven connection query methods
tianchi过往方法
【ClickHouse】 日志清理方法(query_log、query_thread_log)
Spark Sql之join on and和where
C语言 猜数字游戏 (含代码并详细注释)
LNMP架构搭建之论坛
11. cuBLAS Development Guide Chinese version--Level-1 functions amax() and amin() in cuBLAS
汇编语言学习(七)
Three kinds of ThreadLocal, play with thread variable storage and transmission
Thinking about oracle financial data authority
openharmony容器组件之Flex
Row of openharmony container components
shell课程总结
【视频编码学习】——SAD和SATD
CTF题解五 Web PHP大法(实验吧)
mmdetction
Jetpack Compose - the use of Image (picture)
Full GC (Ergonomics)排查分析
汇编语言学习(八)









