当前位置:网站首页>模拟实现strcpy函数的实现(含多次优化思想)

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

2022-08-06 07:26:45GD_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函数优化的最终版本了,喜欢的点个小红心,关注一下,下期更精彩。

原网站

版权声明
本文为[GD_small_bit]所创,转载请带上原文链接,感谢
https://blog.csdn.net/GD_small_bit/article/details/126185384

随机推荐