关于strlen函数的模拟实现

一、strlen函数:

用来求字符串的长度的函数,且计算的是 ‘\0’ 之前的字符的个数;

如下是strlen函数的申明,size_t 表明函数返回类型为无符号整型,const char* a表示字符指针,接受字符串数组,const锁住了指针,防止*a指向的内容不小心发生改变

size_t strlen(const char *a)

二、计数器实现:

先申明下:我每个程序用到了assert()函数,这个函数叫断言,会对括号里面的表达式进行检查,出现错误会报错,指明错误在哪;对指针用,可以防止传参时传出的空指针或者野指针,使程序更严谨,需要注意的是包含头文件

#include<assert.h>;

所谓的计数器,就是设置一个变量 cunt 每确认一个字符,不为\0,则进行加一的操作;

//由计数器完成
#include<assert.h>
size_t my_strlen(const char* s1)
{
	assert(s1);//断言;
	size_t cunt = 0;
	while (*s1++)
		cunt++;
	return cunt;
}

三、指针-指针实现:

因为指针减去指针可以求出两个指针间元素个数,因此我们可以首元素地址减去\0处的地址

while循环中,*s1指向的内容为\0时会结束循环,此时的s1就是\0处的地址;

size_t my_strlen(const char* s1)
{
	assert(s1);
	char* p = s1;//存放首元素地址到指针p中
	//通过while循环来找到\0的地址;
	while (*s1)
		s1++;//此时s1就是\0的地址
	return s1 - p;//返回两个指针间元素个数;
}
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", my_strlen(arr));

	return 0;
}

四、通过递归实现(一般会换种说法:在不创建临时变量的情况下,计算出数组长度):

1、思考并进行编写:

这个时候想到了递归,大事化小的思想;可以从限制条件即结束条件考虑;当*s1指向的内容为\0时,最后一次应该是返回零,因此可以先写出限制条件;我们考虑每次元素不为\0,那么就要加1,递归开始时每次向函数传参,应该是在本函数时,下一个元素的地址,因此就有了s1++;

size_t my_strlen(const char* s1)
{
	assert(s1);
	//递归结束的条件
	if (*s1 == '\0')
		return 0;
	//地址加一,得到下一个元素的地址
	s1++;
	return 1 + my_strlen(s1);
}
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", my_strlen(arr));

	return 0;
}

2、易错提醒:

若是将s1++直接放入函数递归中会怎样呢?

size_t my_strlen(const char* s1)
{
	assert(s1);
	//递归结束的条件
	if (*s1 == '\0')
		return 0;
	
	return 1 + my_strlen(s1++);
}

此时递归就坏了,因为函数调用时,先传参的s1.并不是s1++的值,那就会限制在一直传s1的递归中,已经不符合递归条件了;

当然了,若是放置前置加加,就可以放入函数调用中了

	return 1 + my_strlen(++s1);//前置++,先加一个地址,再传地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值