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

 更新时间:2023年08月14日 09:12:56   作者:苏貝貝  
这篇文章带大家了解C语言中自定义实现strlen函数的3种方法,计数器,递归以及指针,这三种方法通过代码示例介绍的非常详细,需要的朋友可以参考下

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

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

1.计数器

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

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作为最后的值返回。

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’ ,返回两指针的差值

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;
}

到此这篇关于C语言自定义实现strlen函数的3种方法总结的文章就介绍到这了,更多相关C语言实现strlen函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入分析:C++模板究竟会使代码膨胀吗

    深入分析:C++模板究竟会使代码膨胀吗

    今天和同事说到C++模板会使代码膨胀, 可同事觉得不会。 同事的依据是: 如果模板会使代码膨胀, 那么ATL和WTL里为什么还要大量使用模板? 同样功能 ,ATL和WTL编译出的可执行文件可比MFC编译的要小的多
    2013-04-04
  • C++可变参数的函数与模板实例分析

    C++可变参数的函数与模板实例分析

    这篇文章主要介绍了C++可变参数的函数与模板,非常重要的概念,需要的朋友可以参考下
    2014-08-08
  • C++实现LeetCode(78.子集合)

    C++实现LeetCode(78.子集合)

    这篇文章主要介绍了C++实现LeetCode(78.子集合),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解编译器编译原理

    详解编译器编译原理

    这篇文章主要介绍了详解编译器编译原理的相关资料,需要的朋友可以参考下
    2017-06-06
  • C++ 中随机函数random函数的使用方法

    C++ 中随机函数random函数的使用方法

    这篇文章主要介绍了C++ 中随机函数random函数的使用方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • 采用C++实现区间图着色问题(贪心算法)实例详解

    采用C++实现区间图着色问题(贪心算法)实例详解

    这篇文章主要介绍了采用C++实现区间图着色问题(贪心算法),很经典的算法问题,需要的朋友可以参考下
    2014-07-07
  • C语言计算大数相加的方法

    C语言计算大数相加的方法

    这篇文章主要为大家详细介绍了C语言计算大数相加的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++求最大公约数四种方法解析

    C++求最大公约数四种方法解析

    这篇文章主要为大家详细介绍了C++求最大公约数四种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Qt利用QGraphicsView绘制跳舞的机器人

    Qt利用QGraphicsView绘制跳舞的机器人

    最近新学了一招秘密武器,打算分享给大家!那就是如何在QGraphicsView中制作一个跳舞的机器人,快跟随小编一起动手尝试一下吧
    2022-06-06
  • Qt使用流处理XML文件的示例代码

    Qt使用流处理XML文件的示例代码

    XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储。本文主要来和大家聊聊如何使用 Qt 处理 XML 格式的文档,需要的可以参考一下
    2023-02-02

最新评论