编写程序实现strcpy函数

大家好,我是真的王,今天我来分享一下用C语言模拟实现strcpy函数。

文章目录


前言

我们知道strcpy函数是用来拷贝字符串。以下是strcpy的定义:


一、实现

 我们先看函数传递的参数,是两个指针,一个是strSource(字符串的源头),另一个是strDestination(字符串的目的地),因此,我们也需要传递两个指向字符串地址的指针。

而我们知道库里的strcpy函数会传递源头字符串末尾的'\0',因此我么可以这样来写代码。

代码如下:

#include<stdio.h>
void my_strcpy(char* dest, char* sou)
{
	while (*sou != '\0')
	{
		*dest = *sou;
		dest++;
		sou++;
	}
}
int main()
{
	char arr1[] = "Hello World!";
	char arr2[] = "***************";

	my_strcpy(arr2, arr1);

	return 0;
}

 这种写法只能模拟基本功能,如果满分为10分,上述代码只能得5分,还有很多的优化空间。

二、优化

我们根据后置++的特性,以及'\0'的本质为0,我么们可以将判断和循环条件同时改变。

代码如下:

#include<stdio.h>
void my_strcpy(char* dest, char* sou)
{
	while (*dest++=*sou++)
	{
		;
	}
}
int main()
{
	char arr1[] = "Hello World!";
	char arr2[] = "***************";

	my_strcpy(arr2, arr1);

	return 0;
}

 然而这串代码有一个致命缺陷,我们可能会一不小心将来源与目的地的指针传成空指针,导致函数错误

这时我们想到可以加入’‘断言’‘

#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest, char* sou)
{
	assert(dest && sou);

	while (*dest++=*sou++)
	{
		;
	}
}
int main()
{
	char arr1[] = "Hello World!";
	char arr2[] = "***************";

	my_strcpy(arr2, arr1);

	return 0;
}

当我们传错参时它会提醒我们。

我们可能会更加粗心,直接将目的地与来源的指针传反,这时我们可以使*sou的值不能改变来避免。我们可以使用const来修饰sou

#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest,const char* sou)
{
	assert(dest && sou);

	while (*dest++=*sou++)
	{
		;
	}
}
int main()
{
	char arr1[] = "Hello World!";
	char arr2[] = "***************";

	my_strcpy(arr2, arr1);

	return 0;
}

当我们仔细查看strcpy函数的定义是发现strcpy函数是有返回值的,返回类型为char*。strcpy函数的返回值我们可以形成函数的链式访问

#include<stdio.h>
#include<assert.h>
char * my_strcpy(char* dest,const char* sou)
{
	assert(dest && sou);
	char* ret = dest;
	while (*dest++=*sou++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "Hello World!";
	char arr2[] = "***************";

	printf("%s", my_strcpy(arr2, arr1));

	return 0;
}


总结
以上就是今天要讲的内容,本文仅仅简单介绍了strcpy函数的模拟。路漫漫其修远兮啊!!!!

  • 16
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值