string.h库函数的实现---strlen

strlen的实现
作用:求字符串的长度,给定字符串后调用strlen函数可求出给定字符串的长度

实现机制
1.在函数中定义一个临时变量,用于记录字符串的长度,当指针向后走一步,如果是非‘\0’则加1,最终返回临时变量则为长度。
2.不定义临时变量实现,用递归的思路,求一个字符串长度,例如:abcdef的长度就可以表示为1+bcdef的长度,bcdef的长度又可以表示为1+cdef的长度,依次分解为子问题直至遇到‘\0’就可以求得字符串的长度。
3.指针相减得到字符串的长度。刚开始时,两个指针都指向字符串的首元素,让一个指针向后移动,直至遇到’\0’,然后用后指针减去前指针即为字符串的长度。
非递归参考函数

int my_strlen(const char* str)
{
	assert(str != NULL);	//断言判定不允许传空指针
	int ret = 0;
	while (*str != '\0')
	{
		++ret;
		++str;
	}
	return ret;
}

递归参考函数

//递归实现
int my_strlen(const char* str)
{
	assert(str != NULL);
	if (*str == '\0')
	{
		return 0;
	}
	return 1 + my_strlen(str+1);
}

指针相减参考函数

//指针相减实现
int my_strlen(const char* str)
{
	assert(str != NULL);
	char* dest = str;
	while (*dest != '\0')
	{
		dest++;
	}
	return dest - str;
}

参考代码如下

#include <stdio.h>
#include <assert.h>
//
//指针相减实现

int my_strlen3(const char* str)
{
	assert(str != NULL);
	const char* dest = str;
	while (*dest != '\0')
	{
		dest++;
	}
	return dest - str;
}

//递归实现
int my_strlen2(const char* str)
{
	assert(str != NULL);
	if (*str == '\0')
	{
		return 0;
	}
	return 1 + my_strlen2(str+1);
}

//非递归
int my_strlen1(const char* str)
{
	assert(str != NULL);	//断言判定不允许传空指针
	int ret = 0;
	while (*str != '\0')
	{
		++ret;
		++str;
	}
	return ret;
}

int main()
{
	char arr[100] = "abcdef";
	printf("%d\n", my_strlen1(arr));
	printf("%d\n", my_strlen2(arr));
	printf("%d\n", my_strlen3(arr));
	return 0;
}

运行结果展示
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Thinker_serious/article/details/83901195