当前位置:   article > 正文

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

拷贝内容和拷贝\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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17


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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

引入断言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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

这个便是最终的strcpy函数优化的最终版本了,喜欢的点个小红心,关注一下,下期更精彩。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/388294
推荐阅读
相关标签
  

闽ICP备14008679号