当前位置: 首页 > 工具软件 > cpy > 使用案例 >

strcpy库函数初步实现到完美优化

刁钧
2023-12-01

Strcpy的初步实现到完美优化

拷贝一个字符串到另一个字符串里面

我们先创建两个字符串

int main()
{
	char arr1[20] = "xxxxxxxxxxxx";
	char arr2[] = "hello world";
	return 0;
}

要求

将arr2的数据全部传输到arr1里面

我们分析一下

可以使用两个指针分别指向arr1 和 arr2

每次讲arr2的值赋值给arr1之后两个指针向前走一下

终止的条件是遇到‘\0’

在遇到‘\0’停止之后再下面可以再赋值一次

代码如下

这个代码可以

void my_strcpy(char* des, char* cpy)
{
	while (*cpy!='\0')
	{
		*des = *cpy;
		des++;
		cpy++;
	}
	*des = *cpy;
}

int main()
{
	char arr1[20] = "xxxxxxxxxxxx";
	char arr2[] = "hello world";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

这个代码可以拿到60分

那我们可以怎么开始进行优化呢?

我们说后置++可以配合解引用一起使用

这样子修改

void my_strcpy(char* des, char* cpy)
{
	while (*cpy!='\0')
	{
		*des++ = *cpy++;
		
	}
	*des = *cpy;
}

经过这么修改之后这个代码可以拿到70分

那还有没有可以优化的地方呢?

答案还是有的

我们可以把它的赋值放到while循环里去

因为当*cpy为‘0’的时候实际上它的ascll码值也是0

此时while循环终止

void my_strcpy(char* des, char* cpy)
{
	while (*des++ = *cpy++)
	{
		;
	}
}

经过这样子的修改之后 这个函数可以拿到80分

那么还有没有可以优化的地方呢?

答案是有的

有时候如果我们输入cpy是一个空指针的时候 程序就会崩溃

这时候我们就需要一段代码来判断cpy是不是一个空指针

那就要介绍一下我们的assret()断言函数了

assert()断言
如果括号内部的条件是错的就会报错
只在debug版本下有效
再release版本中失效

于是我们写下这段代码

#include<assert.h>
void my_strcpy(char* des, char* cpy)
{
	assert(cpy != NULL);
	while (*des++ = *cpy++)
	{
		;
	}
}

经过这样子的修改 这段代码可以拿到90分!

那么还可不可以做更进一步的优化呢?

答案是可以的

有些时候我们可能讲目的地和需要赋值的内容搞反了 从而造成各种意想不到的错误
因此我们可以讲需要复制的内容用const修饰
这样子就可以避免出现上面的错误啦

代码表示如下

#include<assert.h>
void my_strcpy(char* des,const char* cpy)
{
	assert(cpy != NULL);
	while (*des++ = *cpy++)
	{
		;
	}
}

那么我们可以说 这段代码可以拿到99分

最后一点小细节呢就是我们的库函数是有返回值的 最后设定一个返回值就编程一个完美的strcpy函数啦

char* my_strcpy(char* des, const char* cpy)
{
	assert(cpy != NULL);
	while (*des++ = *cpy++)
	{
		;
	}
	return (des);
}

int main()
{
	char arr1[20] = "xxxxxxxxxxxx";
	char arr2[] = "hello world";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

这就是strcpy的完美实现方式

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯

 类似资料: