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. 感谢大家的阅读,希望能够给一个大大的关注~
相关推荐
q5673152316 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
白榆maple24 分钟前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少28 分钟前
数据结构——线性表与链表
数据结构·c++·算法
许野平41 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
也无晴也无风雨44 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar1 小时前
yelp数据集上识别潜在的热门商家
开发语言·python
朱一头zcy1 小时前
C语言复习第9章 字符串/字符/内存函数
c语言
此生只爱蛋1 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
blammmp1 小时前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧2 小时前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++