【C语言】模拟实现strlen

strlen是非常常用的字符串函数

目录

介绍:

我们可得这个函数是求在字符串开始与'\0'之间的字符串长度

代码示例:

c 复制代码
#include <stdio.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	printf("%d\n", strlen(str1));
	printf("%d\n", strlen(str2));
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

结果:

解释:

这里的6和3容易理解,那么str2>str1怎么解释?

因为strlen返回值类型为size_t类型,为无符号整形 ,

即相减的结果虽然为一个负数,但负数的无符号整形显然是巨大的正数

故大于
:
1.字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
:
2.参数指向的字符串必须要以 '\0' 结束。
:
3.注意函数的返回值为size_t,是无符号的( 易错 )

模拟实现:

实现strlen有多种方法

计数器

思路:

通过设计计数器count进行计数,只要当前字符不为0就+1

代码实现:

c 复制代码
int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

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

递归

思路:

记住递归的两个要素

1.有一个临界值

2.越来越接近临界值

假设有一个字符串abc

那么我们每进行一次递归

字符串就少一个元素,当遇到0时停止递归

c 复制代码
abc//进入函数时的字符串
1+bc//第一次递归
  1+c//..
    1//最后一次

代码实现:

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

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

指针-指针

首先要知道指针-指针得到的是中间的元素个数,并非别的元素
思路:

记录开始的地址

利用循环得到\0的地址

两者相减

代码实现:

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

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

欢迎纠错与讨论

相关推荐
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出书柜中编号只出现一次的那一层——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
weixin_307779133 小时前
C++代码实现MATLAB中的pade函数功能
开发语言·c++·算法·matlab
ProcessOn官方账号3 小时前
java IO操作 你快速认识IO的相关基本知识
java·开发语言
神仙别闹4 小时前
基于C++实现的(控制台)学校开课查询系统
开发语言·c++
只睡四小时4 小时前
JS 手写 D-pad 空间导航:电视端焦点引擎实战
android·开发语言·前端·javascript·ecmascript·hls·空间导航
2601_962218614 小时前
C++的几种编译器的实现
开发语言·c++
多弗朗皮卡丘5 小时前
C++ stack和queue
开发语言·c++·deque·queue·stack·容器适配器
维克兜率天5 小时前
【维克】弹性策略:用“乖离率“捕捉超跌反弹
android·开发语言·python·深度学习·kotlin·量化
TOOLS指南5 小时前
Chatshare 域名乱象:如何辨别仿冒站点,避坑指南
开发语言·信息可视化
茉莉玫瑰花茶5 小时前
GO [ 函数 ]
开发语言·后端·golang