13. 《C语言》——【strlen函数的使用和模拟实现】

文章目录

  • 前言
  • strlen函数
    • strlen函数的使用
    • strlen函数的3种方法实现
      • 方法1
      • 方法2
      • 方法3
  • 总结


在这里插入图片描述


前言

	各位老板好~ , 今天我们讲解strlen函数如何去使用以及如何去模拟实现strlen函数。希望各位老板能够给一个点赞和一个大大的关注,感谢各位老板!

strlen函数


strlen函数的使用

在库函数中,strlen函数的功能是求出字符串的长度,统计的是字符串中\0之前的字符个数。

函数原型如下:

size_t strlen ( const char * str );

使用strlen函数,需要包含头文件:

#include<string.h>

使用代码如下:

//strlen函数的使用
#include<string.h>
#include<stdio.h>
int main()
{char arr[] = "zhangsan"; size_t len = strlen(arr); printf("%zd\n", len); return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 值得注意的是strlen函数的返回值是size_t,也就是返回无符号整型,那么对应的占位符使用%zd。
  2. const char * str , 接收的是数组首元素的地址。
  3. 使用库函数,不要忘记包含对应的头文件。

strlen函数的3种方法实现


方法1

方法1,我们使用计数器方法,那么大概思路就是,我有一个指针变量p,它指向的是这个数组,指针变量p++,只要p指向的不是’\0’,那么我的计数器count++。


代码如下:

//strlen函数的模拟实现 
//方法1(计数器) 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{int count = 0; //计数器assert(p != NULL); while (*p != '\0')//只要*p不等于'\0' , count就++{count++; p++; }return count; 
}
int main()
{char arr[] = "zhangsan"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 为了完成strlen函数的模拟,我们自己写了一个函数:my_strlen。首先,函数进行传参(数组传参传的是数组首元素的地址)。其次,创建变量len来接收值。最后打印该值。
  2. 进入函数里面,我们该如何去写? 既然传递的是地址,那么我们需要使用指针来接收,为了不想让值被修改,我们可以加上const的修饰指针。返回类型我们就按照strlen函数的一样就可以。
  3. 然后,既然是使用计数器方法,我们就创建一个计数器count。在其之前,我们可以使用assert函数断言一下,判断一下我们的指针是不是空指针,如果是会报出错误,使用assert,需要包含对应的头文件。
  4. 我们需要遍历数组元素,如果指针*p不是’\0’,那么计数器count++,最终,返回count就可以;如果是’\0’,直接结束。

方法2

方法二,我们使用指针-指针的方法。也就是让指针末-指针首就可以得到中间值,指针-指针必须是在同一内存空间。


代码如下:

//strlen函数的模拟实现 
//方法2(指针-指针) 
#include<stdio.h> 
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); const char* start = p; const char* end = p;   while (*end != '\0'){end++; }return end - start; }
int main()
{char arr[] = "abcdefg";  size_t len = my_strlen(arr);  printf("%zd\n", len);return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 创建一个字符数组,值为"abcdefg" , 随后,创建一个函数叫my_strlen,对它进行传参。创建len来接收my_strlen的值,最后打印该值。
  2. 进入函数内部,因为my_strlen传递的是数组首元素的地址,我们需要使用指针p来接收,并且使用const修饰指针p。my_strlen的返回类型是size_t。
  3. assert断言一下指针变量是不是为空,使用assert需要包含头文件。创建2个新的指针变量,分别为start和end,把p赋值给这2个指针变量。随后进行遍历,如果不是’\0’,end++。最后,end - start 也就是指针-指针,并且返回。

方法3

我们使用递归来解决,那么如何去使用递归?我们知道,使用递归需要遵循2个前提

  1. 递归存在限制条件,当满足这个限制条件时,递归就不再继续
  2. 每一次递归,都会接近限制条件

当我们了解了这2个前提,那么我们就可以使用递归了。


代码如下:

//strlen函数的模拟实现 
//方法3(递归) 
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* p)
{assert(p != NULL); if (*p != '\0')return 1 + my_strlen(p + 1);elsereturn 0;
}
int main()
{char arr[] = "abcdefg"; size_t len = my_strlen(arr); printf("%zd\n", len); return 0; 
}

运行结果:

在这里插入图片描述

分析:

  1. 创建字符数组,并且进行初始化;写一个函数my_strlen,创建一个变量len,接收值。最后,打印值。
  2. 进入函数内部,既然传递的是数组首元素的地址,我们就创建指针变量p来接收,我们不想让值进行改变,使用const修饰指针变量。my_strlen函数的返回类型与strlen函数一致,为size_t 。
  3. 使用assert断言一下,确保p不是空指针。使用assert需要保证包含头文件。
  4. 在前面,我们说了递归的使用方法,需要有一个限制条件,那么如果p不等于’\0’,就进行递归,否则,else 返回0。

总结

  1. 以上就是本文章的内容,我们使用了3个方法来模拟strlen函数。
  2. 感谢大家的阅读,希望能够给一个大大的关注~
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

塑料焊接机熔深对激光焊接质量有什么影响

塑料焊接机的熔深对焊接质量具有直接且显著的影响。以下是熔深对焊接质量影响的详细解释&#xff1a; 1. 焊接强度&#xff1a;熔深直接决定了焊缝的截面积&#xff0c;从而影响焊接接头的强度。较深的熔深意味着焊缝的截面积更大&#xff0c;可以提供更强的结合力&#xff0c;…

OpenStreetMap部署(OSM)

参考&#xff1a;https://github.com/openstreetmap/openstreetmap-website/blob/master/DOCKER.md OpenStreeMap 部署 操作系统建议使用 Ubuntu 22 版本 安装 Docker # 更新软件包索引&#xff1a; sudo apt-get update # 允许APT使用HTTPS&#xff1a; sudo apt-get inst…

【计算机组成原理】详谈计算机发展历程

计算机发展历程 导读一、计算机的诞生1.1 历史背景1.2 计算机的发明 二、计算机硬件的发展1.1 计算机的四代变化1.1.1 第一代计算机bug的由来 1.1.2 第二代计算机1.1.3 第三代计算机半导体存储器的发展 1.1.4 第四代计算机 1.2 个人计算机的发展1.2.1 微处理器的发展1.2.2 个人…

AIGC之Stable Diffusion Web Ui 初体验

前言 Stable Diffusion辣么火&#xff0c;同学你确定不尝试一下嘛&#xff1f; 纯代码学习版本搞啦&#xff0c;Web Ui 也得试试咧 网上有很多安装Stable Diffusion Web Ui 的介绍了&#xff0c;我在这说一下我的踩坑记录 想安装的同学&#xff0c;看这个链接 万字长文&#x…

U-Net: Convolutional Networks for Biomedical Image Segmentation--论文笔记

U-Net: Convolutional Networks for Biomedical Image Segmentation 资料 1.代码地址 2.论文地址 https://arxiv.org/pdf/1505.04597 3.数据集地址 论文摘要的翻译 人们普遍认为&#xff0c;深度网络的成功训练需要数千个带注释的训练样本。在本文中&#xff0c;我们提出…

44-5 waf绕过 - SQL注入绕WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装sqlilabs靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、双写绕过 打开sql靶场的第一关:http://127.0.0.1/sqli-labs-master/Less-1/?id=1 验证一下waf是否开启防…

C\C++内存管理(未完结)

文章目录 一.C\C内存分布二.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三.C内存管理方式3.1.new/delete操作内置类型3.2.new和delete操作自定义类型 四.operator new与operator delete函数&#xff08;重要点进行讲解&#xff09;4.1. operator new与oper…

npm install 出错,‘proxy‘ config is set properly. See: ‘npm help config‘

背景 从远程clone下项目之后&#xff0c;使用命令 npm install 安装依赖&#xff0c;报错如下 意为&#xff1a; 报错&#xff1a; npm犯错!network与网络连通性有关的问题。 npm犯错!网络在大多数情况下&#xff0c;你背后的代理或有坏的网络设置。 npm犯错!网络 npm犯错…

spring-kafka-生产者服务搭建测试(SpringBoot整合Kafka)

文章目录 1、生产者服务搭建1.1、引入spring-kafka依赖1.2、使用Java代码创建主题分区副本1.3、发送消息 1、生产者服务搭建 1.1、引入spring-kafka依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/…

KOL营销新篇章:互动式内容与线上活动如何助力品牌增长

在当今数字化时代&#xff0c;KOL营销已成为品牌推广的重点策略之一。然而&#xff0c;随着市场竞争的加剧&#xff0c;单纯依靠KOL的曝光已经不再足够&#xff0c;更多的是需要与用户进行互动&#xff0c;帮助品牌与受众建立更紧密的联系。本文将探讨KOL营销如何通过互动式内容…

《企业应用架构模式》学习指南

导读&#xff1a;企业应用包括哪些&#xff1f;它们又分别有哪些架构模式&#xff1f; 世界著名软件开发大师Martin Fowler给你答案 01什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈及的模式也都是关于企业应用的。&#xff08;企业应用还有…

怎么用NodeJS脚本实现远程控制空调

怎么用NodeJS脚本实现远程控制空调呢&#xff1f; 本文描述了使用NodeJS脚本调用HTTP接口&#xff0c;实现控制空调&#xff0c;通过不同规格的通断器&#xff0c;来控制不同功率的空调的电源。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备…

MySQL从入门到高级 --- 12.事务 13.锁机制 14.日志

文章目录 第十二章 && 第十三章 && 第十四章&#xff1a;12.事务12.1 特性12.2 隔离级别 13.锁机制13.1 各存储引擎对锁的支持状况&#xff1a;13.2 锁特性13.3 MyISAM表锁13.3.1 加表锁 13.4 InnoDB行锁13.4.1 行锁特点13.4.2 行锁模式 14.日志14.1 错误日志1…

深入理解计算机系统 第三版 中文版 图5-27 p371 错漏

中文版 英文版 对照 可以看出错漏 这本书中文版很多错漏,可以配合英文版查正,不过英文版也很多错漏,所以不用太相信书本.要根据自己的理解来.

微软云计算Windows Azure(一)

目录 一、微软云计算平台二、微软云操作系统Windows Azure&#xff08;一&#xff09;Windows Azure概述&#xff08;二&#xff09;Windows Azure计算服务&#xff08;三&#xff09;Windows Azure存储服务&#xff08;四&#xff09;Windows Azure Connect&#xff08;五&…

Win 11官宣取消硬件限制,微软这次彻底服软了

上市近 3 年&#xff0c;微软寄予厚望的 Win 11 终究落了个被上代 Win 10 光环狠狠掩埋的结局。 有小伙伴儿认为是 Win 11 本身做的太烂&#xff0c;更新频繁、BUG 一堆&#xff0c;让人失去兴趣。 也有人认为&#xff0c;系统本身体验没啥大毛病&#xff0c;严苛的硬件限制才…

数据结构算法-堆排序

堆排序&#xff1a;利用堆的特性进行排序,先将数组转换为堆对象&#xff08;最大堆或最小堆&#xff09;&#xff0c;以最大堆为例&#xff0c;每次heapify之后&#xff0c;取出堆顶&#xff08;索引为0)的元素与最后一个元素交换。以后每次做同样的事情&#xff0c;只是堆的长…

Golang性能分析工具pprof--远程分析时无法定位源代码行数问题解决方案

场景 通过命令行模式的list命令&#xff0c;为了查看指标消耗在具体哪一行&#xff0c;需要源代码。但实际程序是部署在线上或者程序的源代码目录变了&#xff0c;则pprof从默认路径找不到代码&#xff0c;无法显示是哪一行的问题。 通过浏览器模式的source页面&#xff0c;有…

JUC总结3

CAS 简介 CAS的全称是“比较并交换”&#xff0c;是一种无锁的原子操作&#xff0c;其体现了乐观所的思想&#xff0c;在无锁的情况下保证线程操作共享数据的原子性。 CAS一共有3个值&#xff1a; 1、V&#xff1a;要更新的值&#xff1b; 2、E&#xff1a;预期值&#xf…

RHCE (Linux进阶) Ubuntu 操作系统安装教程

一、在官网下载iso镜像文件 下载地址&#xff1a; https://cn.ubuntu.com/download/server/step1#downloads&#xff08;下载最新的Ubuntu 20.04 LTS服务器版本&#xff09; 二、VMware安装配置过程 基本安装过程 1、新建虚拟机 2、选择典型即可 3、设置下载好的Ubuntu对应路…