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

欢迎纠错与讨论

相关推荐
7***37452 分钟前
Java设计模式之工厂
java·开发语言·设计模式
上不如老下不如小17 分钟前
2025年第七届全国高校计算机能力挑战赛初赛 Python组 编程题汇总
开发语言·python·算法
程序员小白条27 分钟前
你面试时吹过最大的牛是什么?
java·开发语言·数据库·阿里云·面试·职场和发展·毕设
yuuki23323338 分钟前
【C++】初识C++基础
c语言·c++·后端
小年糕是糕手38 分钟前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
豐儀麟阁贵41 分钟前
8.2异常的抛出与捕捉
java·开发语言·python
权泽谦42 分钟前
PHP 版羊了个羊完整开发实战:逻辑解析 + 三消算法 + 全套接口(附源码)
开发语言·php
程序员西西1 小时前
SpringBoot无感刷新Token实战指南
java·开发语言·前端·后端·计算机·程序员
Coding_Doggy1 小时前
链盾shieldchiain | 团队功能、邀请成员、权限修改、移除成员、SpringSecurity、RBAC权限控制
java·开发语言·数据库
q***64971 小时前
VS与SQL Sever(C语言操作数据库)
c语言·数据库·sql