IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言】-关于strlen的介绍以及三种模拟实现的方法 -> 正文阅读

[C++知识库]【C语言】-关于strlen的介绍以及三种模拟实现的方法

作者:低调
作者宣言:写好每一篇博客


前言

今天我们来讲解一下strlen函数,这是一个计算字符串长度的一个库函数,接下来我将用三种方式来模拟实现这个函数,分别是,创建临时变量法,递归法,指针法。


一、strlen函数的使用

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

通过msdn查询可知这是计算字符串或者字符数组长度的一个库函数,size_t是他的返回值类型,(size_t也叫unsigned int 叫做无符号整型,大家应该理解长度肯定是大于等于0的整数,但我们模拟实现的时候可以写成int类型的),对应的头文件是<string.h>,参数是const char*string ,因为你是计算他的长度,并不会改变他的内容,所以用const修饰,如果字符串为空,就返回一个空指针,也就是0.

让我们先看一段代码,在了解一下:

//代码1
#include <stdio.h>
#include<string.h>
int main()
{
char arr[]="abc";
int len=strlen(arr);
printf("%d\n",len);
return 0;
}

在这里插入图片描述
大家看看是不是想要的结果,很显然是我们想要的,那好,我们再来看一个代码:

//代码2
#include <stdio.h>
#include<string.h>
int main()
{
char arr[]={'a','b','c'};
int len=strlen(arr);
printf("%d\n",len);
return 0;}

在这里插入图片描述
怎么回事,15是怎么回事,我开始刚学的时候也是不懂,后来才知道,strlen计算长度的时候是必须要有一个终止条件的,他算到\0的时候就会停止计算,代码1是字符串,最好一位默认带有一个\0,这个\0不当作字符串长度,而代码2是字符数组,后面没有\0,所以计算出15这个随机值,如果想计算出这个字符数组就必须自己在数组后面加一个’\0’.才能达到想要的结果,读者可以自己下去试试。

思考:若定义一个char arr[]={‘a’,‘b’,‘c’,‘\0’,‘d’,‘e’};这时候结果是多少呢?
若定义一个char arr[]={‘a’,‘b’,‘c’,‘\\0’,‘d’,‘e’,‘\0’};这时候结果又会是怎样?

接下来进入正题,很多小伙伴很疑惑,作者你为啥不直接介绍那三种办法,我想说的是,我这篇文章也会有不知道strlen的人阅读,讲模拟实现的时候,我们的把他的原理搞清楚,我们才能更好的去理解,去实现。

二、strlen函数的模拟实现

2.1创建临时变量法

我们以代码1为例讲解:
通过Fn+f10,进行调试,看到内存窗口,进去可以看到
大家可以看到arr在内存的存储,大家可以看我第一篇博客,有介绍到一个字符占一个字节,地址上每两位数占一个字节,而且是连续存放的。这样我们是不是就可以想办法,找到他在内存中首地址,然后每次走一个地址,统计走了几次,是不是就是字符串长度了
接下来用代码来给大家展示:

int my_strlen(char*str){
int count=0;//创建一个临时变量来统计位置变化多少次
while(*str!='\0')
{
count++;
str++;}
return count;

这里需要对指针部分的知识有所了解,我们传arr过去,相当于传了首元素地址,用一个指针接收,这就找到了61这个地址,*是解引用,相当于找到里面的内容,str++,是地址位置发生变化,向后挪了一位。当地址挪到00位置处,循环停止,返回count。就是想要的结果。

在这里插入图片描述

达到了我们想要的结果了。

2.2递归法

递归法我将会直接给大家上代码,在用递归展开图给大家梳理一遍:

int my_strlen(char*str){
if(*str!='\0')
{
return 1+my_strlen(str+1);}
else
{
return 0;}
}

在这里插入图片描述
在这里插入图片描述
也达到了想要的结果了

思考:大家可以想想为什么要写成这样(return 1+my_strlen(str+1);)直接这样会出现什么结果(return my_strlen(str+1);)

答案:如果少了这个加1,当要求的长度只有1的时候,他返回只有0,我们也可以这么理解,这整个递归函数中如果没这个加1,他每次只能返回+0的数,达不到想要的结果。理解这个,递归法应该就能了解清楚了。

2.3指针法

指针法建立在创建临时变量的基础上,通过地址的变化来达到想要的结果,刚才我们是先找到了首元素的地址,然后一个一个的遍历,当\0才结束循环,因为刚才也介绍,字符串在内存的存储是连续的,这样我们可以这样是实现,我们可以定义两个指针,一个指向首地址,一个指向尾地址,把两个位置相减,不就是想要的结果吗,此图是end指向\0,停止进入循环,实际指向’c‘的地址。
在这里插入图片描述
我们来对照着图写代码:

int my_strlen(char*str){
char*star=str;
char*end=str;
while(*end!='\0'){
end++;}
return end-star;}

在这里插入图片描述
我们也达到了想要的结果了。

总结

相信通过上面三种办法,我们对strlen函数又进一步的了解了,其他原理都一样,通过对地址的访问,来统计数量的一种方式,虽然库函数给我们提供了对应的函数,但我们通过对他的理解,自己实现了这个库函数的功能,第一,提高我们的思维能力,第二,是我们在使用这个函数时更加的得心应手。

在这儿里给读者分享一个经验,学习是一个循序渐进的东西,每个知识点看起来很简单,就好比这个strlen函数,但他里面大有学问,我们能做到的就是不放弃,作者也是一步一步这样过来的,和你们分享学习经验,一起学习,一起进步,才能成长的更快!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:46:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 13:58:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码