C语言:模拟实现库函数strcpy

如何自己写出一个函数来模拟实现库函数strcpy呢?

首先,我们要知道strcpy这个函数的功能、用法有哪些,这里,我推荐一个查询的网站,名字叫:cplusplus,网址:cplusplus.com - The C++ Resources Networkhttp://www.cplusplus.com/

这个网站是全英文的,如果不想看英文的话,也可以看看其对应的中文网站,名字叫:cppreference,网址: cppreference.comhttps://zh.cppreference.com/w/%E9%A6%96%E9%A1%B5

接下来,我们就先随便打开一个网站来查一下strcpy,这里我用的是cplusplus,其中,重要的信息我已经写在图片中了,可以参考一下:

这里,我们已经知道了strcpy是如何调用函数的,那接下来的编程也就变得很简单了,下面写的代码中,我也会分三个等级层次,逐渐优化所要模拟的库函数strcpy的代码(模拟实现库函数strcpy的函数名暂且称为my_strcpy):

1. 初级:第一阶段就是很直接地,传址->交换->默认返回

#include <stdio.h>

void my_strcpy(char* src, char* dest)   //模拟实现库函数strcpy (初级)
{
	while (*src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
	}
	*dest = *src;
}

int main()
{
	char* ch = "abcde";
	char* copy[20] = {0};
	my_strcpy(ch, copy);
	printf("%s\n", copy);
	return 0;
}

2. 中级:对初级的优化,使其更加严谨,同时使代码看起来更加简练

#include <stdio.h>
#include <assert.h>

void my_strcpy(char* src, char* dest)   //模拟实现库函数strcpy (中级)
{
	assert(src != NULL && dest != NULL);
	while (*dest++ = *src++)
	{
		;
	}
}

int main()
{
	char* ch = "abcde";
	char* copy[20] = { 0 };
	my_strcpy(ch, copy);
	printf("%s\n", copy);
	return 0;
}

这里,我们使用了之前介绍过的assert函数进行断言,如果使空指针,编译时能运行,但结果会提示错误。这样可以让代码更加严谨,也便于我们及时找出错误。此外,我们还将while语句改为后置++的形式,把while中的语句块变为空语句,其实,这个思路和前面的大致相同,只是将其进一步简化而已。

3. 高级:对中级进一步严谨化

#include <stdio.h>
#include <assert.h>

void my_strcpy(char const * src, char* dest)   //模拟实现库函数strcpy (高级)
{
	assert(src && dest);
	while (*dest++ = *src++)
	{
		;
	}
}

int main()
{
	char* ch = "abcde";
	char* copy[20] = { 0 };
	my_strcpy(ch, copy);
	printf("%s\n", copy);
	return 0;
}

相比上面的代码,这里多了一个const,那么这个const有什么用呢?

这里简单介绍一下,count是用来保护参数,const修饰指针有两种情况:

一是,const放在*的左边,修饰的是指针指向的内容,表示指针指向的内容不能通过指针来改变,但是指针变量本身是可以改变的。

二是,const放在*的右边,修饰的是指针变量本身,指针变量的内容不能被改变,但是指针指向的内容是可以通过指针来改变的。

通过对const的了解后,我们可以看到代码中*src的前面加上了const,说明是第一种情况,指针指向的内容是不能通过指针来改变的,这对下面while语句条件中起来很大的作用,如果不是按上面代码那样写,而是倒过来,变成:*src++ = *dest++,运行起来后就会马上报错,因为const修饰*src,使得*src不能被改变,而这样却把改变的*dest赋值给*src,当然会报错了。这样写的好处是,把你一开始的想法先规范起来,不会导致后面乱了出现不知道该改哪个,不该改哪个的情况。

本次文章比较长,字比较多,但知识点也很多,以及对同个代码的不断改进优化,希望对大家有帮助。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡欣致

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值