一文带你完全吃透strlen函数

本文详细介绍了C语言中的strlen函数,包括其接口定义、工作原理及库函数源代码分析。通过三种不同的模拟实现方法(计数器法、递归法和指针-指针法),帮助读者深入理解strlen函数的本质。此外,文章强调了理解和掌握字符串函数的重要性,特别是对于面试和日常编程的必要性。
摘要由CSDN通过智能技术生成

程序虐我千百遍,我待程序如初恋!💓💓

• 🌙写在前面

💖💖💖Hello,大家好啊,我是vince,小白一名,撰写博客:⭐️⭐️⭐️一为更好的锻炼自己,巩固知识;⭐️⭐️⭐️二为和大家一起在代码的海洋里探索。

如果大家感兴趣的话 ——🎉🎉🎉 欢迎关注csdn博客:< vince >,我们互相学习,共同进步哈~🌟🌟🌟

在这里插入图片描述
今天vince将和大家一起去一一吃透字符串函数,接下来我将一篇文章介绍一个函数,这样大家在学习时也不会因为文章过长而劳累厌倦。☀️☀️☀️


  🎉🎉🎉strlen函数详解如下🎉🎉🎉

在这里插入图片描述

• 🍋1.函数介绍

 • 🌰1.1.函数接口 \colorbox{#00FFFF}{ • 🌰1.1.函数接口}  • 🌰1.1.函数接口

size_t __cdecl strlen (const char * str);

这里是库函数中的strlen函数接口定义形式,供参考哈✨✨✨。
图解分析:
在这里插入图片描述

 • 🌰1.2.函数详述 \colorbox{#00FFFF}{ • 🌰1.2.函数详述}  • 🌰1.2.函数详述

1、字符串 以反斜杠0作为结束标志 \colorbox{pink}{以反斜杠0作为结束标志} 以反斜杠0作为结束标志strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )

2、参数指向的字符串必须要以 ‘\0’ 结束

3、注意函数的 返回值为size_t ,是无符号的( 易错 )。

在这里插入图片描述

• 🍋2.库函数源代码

#include <string.h>

#pragma function(strlen)

size_t __cdecl strlen (const char * str)
{
	const char *eos = str;
	while( *eos++ ) ;
	return( eos - str - 1 );//这里-1的原因是因为*eos++是后置++,所以在判断到'\0'的时候,
}

 • 🌰2.1.库函数分析 \colorbox{#00FFFF}{ • 🌰2.1.库函数分析}  • 🌰2.1.库函数分析

💯 分析:
1、这里面 size_t 无符号整型 const 修饰是一般代码书写的规范,所以一般我们在书写代码时候应该习惯并且正确使用 const

2、这库函数里面计算字符串长度是利用 指针-指针 的方法实现的。一个指向字符串尾部的指针减去一个指向字符串头部的指针,所得的值就是字符串的长度。


💘💘💘知识连线时刻

  🎉🎉🎉指针-指针往期回顾🎉🎉🎉
[这篇文章第五点指针的运算:让你快速详细回顾指针-指针]

在这里插入图片描述

• 🍋3.模拟实现strlen函数

 • 🌰3.1.方法1:计数器法 \colorbox{#00FFFF}{ • 🌰3.1.方法1:计数器法}  • 🌰3.1.方法1:计数器法

int my_strlen(const char* str)
{
 assert(str);
 int count = 0;
 while (*str != '\0')
 {
 	count++;
 	str++;
 }
 return count;
}
int main()
{
 int len  = my_strlen("abcdef");
 printf("%d\n",len);
 return 0;
}

💯 分析:
这种方法是最简单的思路,最基础的知识,创建一个 count 作为计数器,记录指针从字符串头部走到尾部的次数,就是其字符串的长度

 • 🌰3.2.方法2:递归实现 \colorbox{#00FFFF}{ • 🌰3.2.方法2:递归实现}  • 🌰3.2.方法2:递归实现

 int my_strlen(const char* str)
 {
 	if (*str != 0)
 	{
 		return 1 + my_strlen(1 + str);
 	}
 	else
 	{
 		return 0;
 	}
 }
 int main()
 {
 	char ch[] = "abcdef";
 	int len = my_strlen(ch);
 	printf("%d\n", len);
 return 0;
 }

💯 分析:
这里是利用 递归 来实现,递归是一种实现算法的方法,一般可以将问题简单化,所以递归也是需要重点掌握的内容之一。


💘💘💘知识连线时刻

  🎉🎉🎉递归往期回顾🎉🎉🎉
      往期递归详解

 • 🌰3.3.方法3:指针-指针 \colorbox{#00FFFF}{ • 🌰3.3.方法3:指针-指针}  • 🌰3.3.方法3:指针-指针

int my_strlen(const char* str)
{
	assert(str);
	const char* str1 = str;
	while (*str != '\0')
	{
		str++;
	}
	return str - str1;
}
int main()
{
	char ch[] = "abcdef";
	int len = my_strlen(ch);
	printf("%d\n", len);
	return 0;
}

💯 分析:
这里第三种模拟实现方法和库里面实现strlen函数使用的原理相同,当然里面最重要的原理就是:指针的运算(指针-指针)。🎉🎉🎉上面有关于指针运算的知识连线,大家不熟悉或者忘了的,快去复习回顾一下哈~💘💘💘

在这里插入图片描述

• 🌙写在后面

友友们,相聚的时刻总是短暂的,又到了说再见的时候啦~ 🐳🐳🐳 但是字符串这一块经常在面试的时候会出模拟实现某某字符串函数的面试题,因此我们不能只会平时利用头文件直接调用而不去摸清原理哈~ 🐬🐬🐬要做到 摸清、拿捏、吃透 字符串函数。✨✨✨
在这里插入图片描述
代码不负有心人,98加满,向前冲啊🐬🐬🐬

🎉🎉🎉以上代码均可运行,所用编译环境为 vs2019 ,运行时注意加上编译头文件#define _CRT_SECURE_NO_WARNINGS 1

评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<vince>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值