13. 《C语言》——【strlen函数的使用和模拟实现】

文章目录



前言

	各位老板好~ , 今天我们讲解strlen函数如何去使用以及如何去模拟实现strlen函数。希望各位老板能够给一个点赞和一个大大的关注,感谢各位老板!

strlen函数


strlen函数的使用

在库函数中,strlen函数的功能是求出字符串的长度,统计的是字符串中\0之前的字符个数。

函数原型如下:

c 复制代码
size_t strlen ( const char * str );

使用strlen函数,需要包含头文件:

c 复制代码
#include<string.h>

使用代码如下:

c 复制代码
//strlen函数的使用
#include<string.h>
#include<stdio.h>
int main()
{
	char arr[] = "zhangsan"; 
	size_t len = strlen(arr); 
	printf("%zd\n", len); 
	return 0; 
}

运行结果:

分析:

  1. 值得注意的是strlen函数的返回值是size_t,也就是返回无符号整型,那么对应的占位符使用%zd。
  2. const char * str , 接收的是数组首元素的地址。
  3. 使用库函数,不要忘记包含对应的头文件。

strlen函数的3种方法实现


方法1

方法1,我们使用计数器方法,那么大概思路就是,我有一个指针变量p,它指向的是这个数组,指针变量p++,只要p指向的不是'\0',那么我的计数器count++。


代码如下:

c 复制代码
//strlen函数的模拟实现 
//方法1(计数器) 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{
	int count = 0; //计数器
	assert(p != NULL); 
	while (*p != '\0')//只要*p不等于'\0' , count就++
	{
		count++; 
		p++; 
	}
	return count; 
}
int main()
{
	char arr[] = "zhangsan"; 
	size_t len = my_strlen(arr); 
	printf("%zd\n", len); 
	return 0; 
}

运行结果:

分析:

  1. 为了完成strlen函数的模拟,我们自己写了一个函数:my_strlen。首先,函数进行传参(数组传参传的是数组首元素的地址)。其次,创建变量len来接收值。最后打印该值。
  2. 进入函数里面,我们该如何去写? 既然传递的是地址,那么我们需要使用指针来接收,为了不想让值被修改,我们可以加上const的修饰指针。返回类型我们就按照strlen函数的一样就可以。
  3. 然后,既然是使用计数器方法,我们就创建一个计数器count。在其之前,我们可以使用assert函数断言一下,判断一下我们的指针是不是空指针,如果是会报出错误,使用assert,需要包含对应的头文件。
  4. 我们需要遍历数组元素,如果指针*p不是'\0',那么计数器count++,最终,返回count就可以;如果是'\0',直接结束。

方法2

方法二,我们使用指针-指针的方法。也就是让指针末-指针首就可以得到中间值,指针-指针必须是在同一内存空间。


代码如下:

c 复制代码
//strlen函数的模拟实现 
//方法2(指针-指针) 
#include<stdio.h> 
#include<assert.h>
size_t my_strlen(const char* p)
{
	assert(p != NULL); 
	const char* start = p; 
	const char* end = p;   
	while (*end != '\0')
	{
		end++; 
	}
	return end - start; 

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

运行结果:

分析:

  1. 创建一个字符数组,值为"abcdefg" , 随后,创建一个函数叫my_strlen,对它进行传参。创建len来接收my_strlen的值,最后打印该值。
  2. 进入函数内部,因为my_strlen传递的是数组首元素的地址,我们需要使用指针p来接收,并且使用const修饰指针p。my_strlen的返回类型是size_t。
  3. assert断言一下指针变量是不是为空,使用assert需要包含头文件。创建2个新的指针变量,分别为start和end,把p赋值给这2个指针变量。随后进行遍历,如果不是'\0',end++。最后,end - start 也就是指针-指针,并且返回。

方法3

我们使用递归来解决,那么如何去使用递归?我们知道,使用递归需要遵循2个前提

  1. 递归存在限制条件,当满足这个限制条件时,递归就不再继续
  2. 每一次递归,都会接近限制条件

当我们了解了这2个前提,那么我们就可以使用递归了。


代码如下:

c 复制代码
//strlen函数的模拟实现 
//方法3(递归) 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{
	assert(p != NULL); 
	if (*p != '\0')
		return 1 + my_strlen(p + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "abcdefg"; 
	size_t len = my_strlen(arr); 
	printf("%zd\n", len); 
	return 0; 
}

运行结果:

分析:

  1. 创建字符数组,并且进行初始化;写一个函数my_strlen,创建一个变量len,接收值。最后,打印值。
  2. 进入函数内部,既然传递的是数组首元素的地址,我们就创建指针变量p来接收,我们不想让值进行改变,使用const修饰指针变量。my_strlen函数的返回类型与strlen函数一致,为size_t 。
  3. 使用assert断言一下,确保p不是空指针。使用assert需要保证包含头文件。
  4. 在前面,我们说了递归的使用方法,需要有一个限制条件,那么如果p不等于'\0',就进行递归,否则,else 返回0。

总结

  1. 以上就是本文章的内容,我们使用了3个方法来模拟strlen函数。
  2. 感谢大家的阅读,希望能够给一个大大的关注~
相关推荐
碧海蓝天202217 分钟前
二分法查找有序表的通用算法(可查链表,数组,字符串...等等)
数据结构·算法·链表
wlwhonest33 分钟前
最近公共祖先
算法
小悟空GK36 分钟前
Http介绍
开发语言
502胶水2051 小时前
腾讯地图异步调用
开发语言·ios·swift
钢铁男儿1 小时前
Halcon支持向量机
算法·机器学习·支持向量机
SwBack1 小时前
【pearcmd】通过pearcmd.php 进行GetShell
android·开发语言·php
Lingoesforstudy1 小时前
c#中的超时终止
开发语言·笔记·c#
**K1 小时前
C++ 智能指针使用不当导致内存泄漏问题
开发语言·c++·算法
Leo-Peng1 小时前
辐射神经场算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting
算法·nerf·3d gaussian
菌菌巧乐兹1 小时前
C# 快速排序算法的详细讲解
算法·排序算法