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

欢迎纠错与讨论

相关推荐
春风解人意12 分钟前
从零开始学习嵌入式P32----网络基础之TCP
c语言·网络·学习·tcp/ip
小灰灰搞电子27 分钟前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
传奇开心果编程2 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
新时代牛马2 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob2 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
是隼人3 小时前
buuctf-pwn inndy_echo(32位fmt)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
白山编程大哥3 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
shmily麻瓜小菜鸡4 小时前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
刃神太酷啦4 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
七夜zippoe4 小时前
为什么 2026 年每个 Java 团队都该懂 AI Agent
java·开发语言·人工智能