strlen的自定义函数的三种实现方法

2024-01-01 06:53:49

一,概要

在求字符串长度的时候我们会遇到求解字符串的长度,此时我们想到的是strlen,头文件是string.h,在本次学习中,小编将会带领大家完成字符串函数的功能实现代码是怎么样的,首先strlen求解的是字符串长度,字符串在遇到\0的时候会停止求解,所以我们只需要判断\0之前有多少个字符就可以,而我们需要了解的是strlen的功能实现函数,接下来由我们自己对strlen函数功能实现


二,题目

模拟实现函数strlen,在题目中代码不能使用string.h中的strlen求解字符串的长度,也就是补齐下面代码,也就是补齐my_strlen的功能实现

int main()                
{
	char arr[] = "abcdef";                
	int num = my_strlen(arr);                
	printf("%d ",num);                
	return 0;                
}

三,方法

1,方法一

利用普通循环来实现,设一个加数器count,然后进来因为传进来的是数组首元素的地址,所以先要对它进行解引用判断是否为 \0 不是加数器加1,因为传过来的是数组地址,然后地址加一就指向下一个地址,然后再去判断这不就构成了一个循环,代码如下

int my_strlen(char arr[])  
{
	int count = 0;  
	while (*arr != '\0')      
	{
		count++;      
		arr++;      
	}
	return count;      
}
int main()      
{
	char arr[] = "abcdef";      
	int num = my_strlen(arr);      
	printf("%d ",num);      
	return 0;      
}

2,方法二

递归实现方法,在这里我们需要思考一下,我们在内存中存储如下,首先我们传参传过来的实参是数组名,在数组中首元素的地址就是,所以我们这里接收就是数组首元素的地址,然后进来首先他是指向首元素的地址也就是第一个元素的地址,我们先要对他进行判断,如果不是\0就是加一,如果不是就返回0如下图;

在这里插入图片描述

于是我们就可以如下图一样,进行递归,当最后到\0的时候返回0递归结束

在这里插入图片描述

int my_strlen(char* arr)
{
	if (*arr != '\0')  
	{
		return 1 + my_strlen(arr+1);  
	}
	else                 
	{
		return 0;                 
	}
}
int main()                 
{
	char arr[] = "abcdef";                 
	int num = my_strlen(arr);                 
	printf("%d ",num);                 
	return 0;                 
}

3,方法三

指针减去指针的方法实现,因为指针定义里指针减去指针就是指指针与指针之间元素的个数,因为我们传参传递进来的是首元素的地址,所以我们把首元素的地址存入一个指针变量start中,然后我们对地址进行解引用找到地址所指向的元素进行判断如果这个元素不等于\0则进入循环中,然后地址进行向后移动,直到遇到\0就停止,此时指向的元素的地址就是\0之前的地址,用最后一个地址减去首元素地址就可以得到中间元素的个数,也就是字符串中字符的个数

int my_strlen(char arr[])  
{
	char* start = arr;  
	while (*arr != '\0')  
	{
		arr++;  
	}
	return  arr - start;  
}
int main()  
{
	char arr[] = "abcdef";  
	int num = my_strlen(arr);  
	printf("%d ",num);  
	return 0;  
}

四,总结

通过本次学习我们掌握所学完成自定义求字符串的函数功能实现,如有对strlen函数的一些内容或者在实际中是如何求解的请看小编所写的详解sizeof和strlen。学习就是不断探索的过程,在这里我们掌握了库函数中strlen函数是如何实现求字符串函数的长度的,对于一些其他库函数,大家如果有兴趣的话,也可以自己去实现一下噢。

文章来源:https://blog.csdn.net/weixin_62168696/article/details/135319345
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。