如何写一个自己的strcpy函数

我们在学习数组内容的时候知道,要想把一个数组赋给另一个数组,我们不能像给变量赋值那样直接用等号(=),而是需要用到一个库函数strcpy,那么我们可不可以自己写一个函数,来实现它的功能呢,我们往下看。

这是在www.cplusplus.com上对strcpy这个函数的一些介绍,我们看到,要写这样一个函数,我们首先需要传给他两个地址,然后这个函数实现把surce指向的字符串赋给destnation,完成字符串的交换。

那我们在写我们自己的函数时,可以计划,我们把被复制的字符串定义为src,把要被赋值的那个字符串定义为dest,我们知道数组的名字是数组第一个元素的地址,那么我们可以就从第一个元素开始,然后一个一个的把src的元素赋给dest,包括‘\0’,因为不管dest之前的元素有多长,只要我们把‘\0’也赋值进来,那么在'\0'后面的值就没有效果了,即完成了字符串的复制,下面我们就着手来写代码。

 

 在这个代码中,我们使用了一个while循环,我们对src指向的元素是不是‘\0’进行了一个判断,如果不是,那么就对字符串进行赋值,然后移动指针,直到指针指到scr的'\0'为止,然后我们再单独把这个‘\0’赋给dest,这样我们就完成了字符串的赋值。

上面的代码虽然完成了拷贝字符串的任务,但是不够美丽,我们来对她进行一点小小的修改。

 

 我们发现,我们把while循环中的赋值语句放到了while循环中的判断部分,同样达到了我们的目的,那么这是怎么回事呢,我们来分析一下。

首先我们知道这两个指针的++是后置的,后置++的意思就是我们先使用这两个指针,然后再进行递加,在我们没有指到‘\0’这个元素之前,src指到的都是字符,那么这些字符的ASCII值都是非0,那就代表这个赋值语句的值也是非0,它在循环语句的判断部分时就代表这次判断为真,那么当我们一直赋值,直到src指到了‘\0’,这时候赋值的内容就是把'\0'赋值给dest,而‘\0’的ASCII值就是0,也就代表了整个赋值表达式的值为0,判断条件为假,跳出循环,以此我们就完成了拷贝字符串的目的。

现在我们拷贝字符串的任务虽然完成了,但是我们考虑到,万一在传参的时候,我们传进来的指针是一个空指针怎么办,我们是无法对指针进行访问的,所以我们就要避免这样的情况,那么我们就可以用if语句对传来的两个参数进行判断,代码如下。

  当我们发现我们传进去的有空指针时,就会直接跳出来,这里我们虽然完成了对输入内容的筛选,但是我们每次调用时都要进入这个if语句进行判断,那么我们有没有方法让这个代码更加美丽一些呢,答案是有的,我们可以使用assres

assert--断言--头文件为<assert.h>

assert()的作用就是当括号里的内容为真时,什么都不发生,当内容为假时,就会报错,我们使用assert来改善一下我们的代码

 当我们再传入空指针时,代码就会报错,并且告诉我们错误的位置,非常贴心

 传参正常时,则代码正常运行,什么都不发生。

这时候我们的代码就大概完成了,但是我们回来看strcpy的定义时发现,函数的运行完成后会返回一个char*类型的地址,是destnation的地址,并且在形参source前面用了一个const来修饰,在常量变量的时候我们学到过有一种常量叫const修饰的常变量,即被const修饰的变量就具备了常量的属性,值不能被改变,所以在source前面用const修饰它的意义就是来保护这个地址,因为他是我们被赋值的那个字符串,我们不希望它的内容被改变,所以用const来保护它,那么我们在我们的scr前也用const来修饰一下就好,至于返回值的问题,我们只需要在进行交换之前,把dest的地址备份一些,交换完成后返回就好了。

 以上我们就成功的写出了一个自己的字符串拷贝函数,下面是这个函数的代码。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest,const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = { "abcdef" };
	char arr2[20] = { "XXXXXXXXXXXXXXXX" };
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

如果大家觉得我的文章对你有帮助,希望能够给我点赞支持一下,铁柱在这里谢谢大家了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

c铁柱同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值