【C语言】自定义实现strlen函数的3种方法

大家好,我是苏貝,本篇博客带大家了解C语言中自定义实现strlen函数的3种方法,如果大家觉得我写的不错的话,可以给我一个赞👍吗,感谢❤️


在自定义实现strlen函数之前,我们简单的介绍一下strlen函数。strlen的功能就是求字符串长度。它只能作用于字符串,是C语言中的库函数,使用时要引用 < string.h> 这个头文件。每个字符串结尾处都隐藏有 '\0' ,它是字符串的结束标志,所以我们在用strlen函数求字符串长度时,遇见 '\0' 时就停止读取字符串,字符串长度为 '\0' 之前的字符个数,不包括 '\0' 。若想更详细地了解strlen函数,请点击该链接

简单介绍strlen函数之后,让我们开始正文


1.计数器

这是3种方法里面最简单的一种,只用将数组作为函数参数,再用计数器i充当数组下标,若arr[i]不是转义字符 '\0' ,i++;直到为 '\0' 时,返回计数器i

c 复制代码
int my_strlen(char arr[])
{
	int i = 0;
	while (arr[i] != '\0')
	{
		i++;
	}
	return i;
}

int main()
{
	char arr[] = "abcdefg";//abcdefg\0
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}
//7

2.递归(不用创造临时变量)

将数组作为函数实参,实际上传过去的是数组首元素地址,用指针接收变量str接收,对str进行解引用操作找到str指向的字符,若该字符为 '\0' ,则返回0;否则返回1+my_strlen(str + 1),再进入my_strlen函数时,str指向下一位,继续上述判断。

例如:若下面代码中char arr[ ]="ab",将数组名arr作为函数实参,用指针str接收,此时str指向数组首元素即字符a。对指针str进行解应用str=a,a!= '\0' ,所以函数返回1+my_strlen(str + 1),再进行下一次递归, 此时str指向下一位字符b。对指针str进行解应用str=b,b!= '\0' ,所以函数返回1+my_strlen(str+1),再进行下一次递归, 此时str指向下一位字符 '\0' 。对指针str进行解应用*str= '\0' ,所以函数返回0,接着返回上一次递归,此时str指向字符b,my_strlen(str + 1) 的结果为0,所以1+my_strlen(str + 1)的结果=1并再将1返回上一次递归。此时str指向字符a,my_strlen(str + 1)的结果=1,所以1+my_strlen(str + 1)结果=2,将2作为最后的值返回。

c 复制代码
int my_strlen(char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

int main()
{
	char arr[] = "abcdefg";//abcdefg\0
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

3.指针(指针-指针的差值的绝对值是它们之间的元素个数)
若想详细了解 指针-指针,请点击该链接

思想:只要最后指针str指向的是 '\0' ,指针start指向的是数组首元素a,那么str - start就是字符串长度

创建指针变量start存放数组首元素地址(str就是数组首元素地址),再用while循环使得str最后指向 '\0' ,返回两指针的差值

c 复制代码
int my_strlen(char* str)
{
	char* start = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - start;
}

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

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

相关推荐
stevewongbuaa26 分钟前
一些烦人的go设置 goland
开发语言·后端·golang
撸码到无法自拔1 小时前
MATLAB中处理大数据的技巧与方法
大数据·开发语言·matlab
Icomi_1 小时前
【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法
c语言·c++·人工智能·深度学习·神经网络·机器学习·计算机视觉
apocelipes1 小时前
Linux glibc自带哈希表的用例及性能测试
c语言·c++·哈希表·linux编程
island13141 小时前
【QT】 控件 -- 显示类
开发语言·数据库·qt
Tanecious.1 小时前
C语言--分支循环实践:猜数字游戏
android·c语言·游戏
sysu631 小时前
95.不同的二叉搜索树Ⅱ python
开发语言·数据结构·python·算法·leetcode·面试·深度优先
Ronin-Lotus1 小时前
上位机知识篇---CMake
c语言·c++·笔记·学习·跨平台·编译·cmake
hust_joker2 小时前
go单元测试和基准测试
开发语言·golang·单元测试
wyg_0311132 小时前
C++资料
开发语言·c++