模拟实现strcpy函数的实现(含多次优化思想)

我今天为大家带来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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值