C语言-strcpy以及strlen函数的模拟实现(附上学C必备网站以及软件)

前言:
本次函数模拟运用到了assert以及const,如不熟悉请跳转👉这里学习后返回阅读。

首先,要先明白这个函数的作用,其次,通过某些网站去查看strcpy函数本身是怎么实现的,这里推荐c/cpp参考手册(访问较慢,站点在国外)或者关注公众号“源晨序”发送MSDN获取软件。

image-20220227193025128

一、strcpy函数的模拟

strcpy:将一个字符数组的内容复制到另一个字符数组上

//strcpy(待拷贝数组,原始数组)
#include <string.h>
int main()
{
	char arr[20] = { 0 };
	char arr1[20] = "hello world";
	strcpy(arr, arr1);
	printf("%s", arr);
	return 0;
}

模拟实现:

①简单思路版:
思路:找到原始数组的‘\0’,然后从头到尾移动到待拷贝数组中

//strcpy函数构造实现
void my_strcpy(char* dest, char* src)
{
	char* tmp = src;
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
    *dest = *src//最后将'/0'放入arr函数内
}

int main()
{
	char arr[20] = { 0 };
	char arr2[20] = "strcpy simulate";
	//strcpy模拟
	my_strcpy(arr, arr2);
	printf("%s", arr);
	return 0;
}

然而我只能说,当面试官给你出这题时,假设这题10分, 你这个答案顶天只能拿到5分,为什么怎么说?我们还没有去靠近strcpy它本身的写法,那怎么靠近呢?在刚刚推荐的网站或者软件上搜索strcpy,接下来带大家一起分析,写出最佳版本!

image-20220227201139824

注意到,在刚刚的模拟中,我们缺少了这几部分,那就增加这部分内容,使得更加像strcpy本身!
②复刻版:

//高分strcpy函数构造实现
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
    char *tmp = dest;
    //使用指针前先判断,利用assert
    assert(dest!=NULL);
    assert(src!=NULL);
	while (*src != '\0')
	{
        //更加简洁
		*dest++=*src++;
	}
    //return dest? NO!,开头创建一个tmp存dest开始的地址
    return tmp;//可以实现链式访问!
}
//my_strcpy函数设计返回值类型是为了实现函数链式访问;

int main()
{
	char arr[20] = { 0 };
	char arr2[20] = "strcpy simulate";
	//strcpy模拟
	my_strcpy(arr, arr2);
	printf("%s", arr);
	return 0;
}

此时的代码堪称<font color = “pink">完美~

几个加分点:
assert、const的使用使得函数更加接近strcpy自己本身。

二、strlen的模拟

有了strcpy的铺垫,这次可以一上来就看看strlen本身是如何实现,抓住重点不放。

image-20220227203355397

size_t无非就是对unsigned int类型的重定义,我们视为int即可

image-20220227204333093

int my_strlen(const char* string)
{
    char* src = string;
    while(*string!='\0')
    {
        string++;
    }
    return  string-src;
}


int main()
{
    char arr[30]="strlen simulate"
     int len = my_strlen(arr);
     printf("%d\n",strlen(arr));
     printf("%d\n", len);
	return 0;
}

结果如图:

image-20220227205052555

总结:

当自己想要去更加真实的模拟一个函数,可以先在c/cpp参考手册或者软件上查找它到底是怎么构成的,这样不论是你想去写这样一个函数或者是对于这一个函数的理解都有非常大的作用

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XY枫晨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值