> 文档中心 > 一文带你完全吃透strlen函数

一文带你完全吃透strlen函数

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

文章目录

    • • 🌙写在前面
    • • 🍋1.函数介绍
      •  • 🌰1.1.函数接口 \colorbox{#00FFFF}{ • 🌰1.1.函数接口}   🌰1.1.
      •  • 🌰1.2.函数详述 \colorbox{#00FFFF}{ • 🌰1.2.函数详述}   🌰1.2.
    • • 🍋2.库函数源代码
      •  • 🌰2.1.库函数分析 \colorbox{#00FFFF}{ • 🌰2.1.库函数分析}   🌰2.1.
    • • 🍋3.模拟实现strlen函数
      •  • 🌰3.1.方法1:计数器法 \colorbox{#00FFFF}{ • 🌰3.1.方法1:计数器法}   🌰3.1.1
      •  • 🌰3.2.方法2:递归实现 \colorbox{#00FFFF}{ • 🌰3.2.方法2:递归实现}   🌰3.2.2
      •  • 🌰3.3.方法3:指针-指针 \colorbox{#00FFFF}{ • 🌰3.3.方法3:指针-指针}   🌰3.3.3-
    • • 🌙写在后面

• 🌙写在前面

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

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

在这里插入图片描述
今天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作为结束标志} 0strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )

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

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

在这里插入图片描述

• 🍋2.库函数源代码

#include #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