strlen的自定义函数的三种实现方法

文章目录

  • 一,概要
  • 二,题目
  • 三,方法
    • 1,方法一
    • 2,方法二
    • 3,方法三
  • 四,总结

一,概要

在求字符串长度的时候我们会遇到求解字符串的长度,此时我们想到的是strlen,头文件是string.h,在本次学习中,小编将会带领大家完成字符串函数的功能实现代码是怎么样的,首先strlen求解的是字符串长度,字符串在遇到\0的时候会停止求解,所以我们只需要判断\0之前有多少个字符就可以,而我们需要了解的是strlen的功能实现函数,接下来由我们自己对strlen函数功能实现


二,题目

模拟实现函数strlen,在题目中代码不能使用string.h中的strlen求解字符串的长度,也就是补齐下面代码,也就是补齐my_strlen的功能实现

int main()                
{
	char arr[] = "abcdef";                
	int num = my_strlen(arr);                
	printf("%d ",num);                
	return 0;                
}

三,方法

1,方法一

利用普通循环来实现,设一个加数器count,然后进来因为传进来的是数组首元素的地址,所以先要对它进行解引用判断是否为 \0 不是加数器加1,因为传过来的是数组地址,然后地址加一就指向下一个地址,然后再去判断这不就构成了一个循环,代码如下

int my_strlen(char arr[])  
{
	int count = 0;  
	while (*arr != '\0')      
	{
		count++;      
		arr++;      
	}
	return count;      
}
int main()      
{
	char arr[] = "abcdef";      
	int num = my_strlen(arr);      
	printf("%d ",num);      
	return 0;      
}

2,方法二

递归实现方法,在这里我们需要思考一下,我们在内存中存储如下,首先我们传参传过来的实参是数组名,在数组中首元素的地址就是,所以我们这里接收就是数组首元素的地址,然后进来首先他是指向首元素的地址也就是第一个元素的地址,我们先要对他进行判断,如果不是\0就是加一,如果不是就返回0如下图;

在这里插入图片描述

于是我们就可以如下图一样,进行递归,当最后到\0的时候返回0递归结束

在这里插入图片描述

int my_strlen(char* arr)
{
	if (*arr != '\0')  
	{
		return 1 + my_strlen(arr+1);  
	}
	else                 
	{
		return 0;                 
	}
}
int main()                 
{
	char arr[] = "abcdef";                 
	int num = my_strlen(arr);                 
	printf("%d ",num);                 
	return 0;                 
}

3,方法三

指针减去指针的方法实现,因为指针定义里指针减去指针就是指指针与指针之间元素的个数,因为我们传参传递进来的是首元素的地址,所以我们把首元素的地址存入一个指针变量start中,然后我们对地址进行解引用找到地址所指向的元素进行判断如果这个元素不等于\0则进入循环中,然后地址进行向后移动,直到遇到\0就停止,此时指向的元素的地址就是\0之前的地址,用最后一个地址减去首元素地址就可以得到中间元素的个数,也就是字符串中字符的个数

int my_strlen(char arr[])  
{
	char* start = arr;  
	while (*arr != '\0')  
	{
		arr++;  
	}
	return  arr - start;  
}
int main()  
{
	char arr[] = "abcdef";  
	int num = my_strlen(arr);  
	printf("%d ",num);  
	return 0;  
}

四,总结

通过本次学习我们掌握所学完成自定义求字符串的函数功能实现,如有对strlen函数的一些内容或者在实际中是如何求解的请看小编所写的详解sizeof和strlen。学习就是不断探索的过程,在这里我们掌握了库函数中strlen函数是如何实现求字符串函数的长度的,对于一些其他库函数,大家如果有兴趣的话,也可以自己去实现一下噢。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何跨系统构建docker镜像?

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 1. 前言 docker镜像有基于amd64系统的,也有基于arm64系统的。 前段时间用了一个在x86_64的centos7服务器上构建的i…

SpringBoot自动配置原理和自定义启动器

1、自动配置的原理 项目在加载上下文时,会根据SpringBootApplication注解运行。该注解中有一个CompoentScan注解,会扫描和加载当前启动类所在的目录,以及所有的子目录;还有一个是EnableAutoConfiguration注解,这个注解…

huggingface的tokenizer解读

文章目录 前言一、huggingface的tokenizer含义1、含义2、整体概括 二、加载lmsys/vicuna-7b-v1.5模型的tokenizer三、调用tokernizer方法四、字符串的tokens应用1、tokenizer应用2、tokenizer进行token分词(tokenizer.tokenize)3、tokens转模型识别ids(tokenizer.convert_token…

Centos7:Jenkins+gitlab+node项目启动(2)

Centos7:Jenkinsgitlabnode项目启动(1) Centos7:Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7:Jenkinsgitlabnode项目启动(2) Centos7:Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7:Jenkinsgitlabnode项目启…

数据结构【线性表篇】(三)

数据结构【线性表篇】(三) 文章目录 数据结构【线性表篇】(三)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件? 目录一、双链表二、循环链表三、静态链表 结语 前言 为什么突然想学算法了? > 用较为“官方…

回溯法求不等式的所有整数解

这份代码本来是用来解决这个问题的 但是&#xff0c;修改之后即可用来解决任意多个xi组成的满足不等式的整数解 这里用真代码而不是伪代码来表示 源代码&#xff1a; #include<iostream> using namespace std; const int N1010; int p,q,r,goal,n; int cnt,sum,MIN; i…

ES6之生成器(Generator)

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

挑战Python100题(9)

100+ Python challenging programming exercises 9 Question 81 Please write a program to randomly print a integer number between 7 and 15 inclusive. Hints: Use random.randrange() to a random integer in a given range. 请编写一个程序,随机打印一个介于7和15之间…

Java学习,一文掌握Java之SpringBoot框架学习文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

2021-06-25 51蛋骗鸡按键切合LED

缘由ISIS 7 Professional_有问必答-CSDN问答 #include "REG52.h" sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; void main() {unsigned char Xd0,xz0,cs0;unsigned int wei0;P1255;while(1){if(K10&&Xd0){P10;while(K10);}if(K20&&…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于预训练ESPCN的轻量化图像超分辨率模型TPU部署方案

2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 作品名&#xff1a;基于预训练ESPCN的轻量化图像超分辨率模型TPU部署方案 队伍名&#xff1a;Absofastlutely 蒋松儒 计算机科学与技术系 硕士 南京大学 中国-江苏 kahsoltqq.com 吕欢欢 计算…

AI产品经理 - 如何做一款软硬协同AI产品

【背景】从0做一款软硬协同的AI产品&#xff0c;以智能医药保温箱 1.以智能医药保温箱 2.调研定义市场方向 地点&#xff1a;医药、实验室 场景&#xff1a;长宽高/装箱/运输/实验室 3.需求挖掘 4.如何进行软硬件AI产品工作 软硬件产品设计&#xff1a;功能/硬件外观设计、…

《数据库开发实践》之存储过程【知识点罗列+例题演练】

一、什么是存储过程&#xff1f; 1.概念理解&#xff1a; 存储过程是一组为了完成特定功能的SQL语句集。通过组成SQL语句和控制语句&#xff0c;提供一种封装任务的方法。因此在创建编译好某个存储过程后&#xff0c;因为存储过程中有可执行操作的sql语句&#xff0c;用户可以…

OFDM——PAPR减小

文章目录 前言一、PAPR 减小二、MATLAB 仿真1、OFDM 信号的 CCDF①、MATLAB 源码②、仿真结果 2、单载波基带/通频带信号的 PAPR①、MATLAB 源码②、仿真结果 3、时域 OFDM 信号和幅度分布①、MATLAB 源码②、仿真结果 4、Chu 序列和 IEEE802.16e 前导的 PAPR①、MATLAB 源码②…

模型 KANO卡诺模型

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。需求分析。 1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅&#xff0c;你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈&#xff0c;并分析客户的…

MySQL的日志管理以及备份和恢复

MySQL日志管理 mysql的日志默认保存位置为/usr/local/mysql/data vim /etc/my.cnf #开启二进制日志功能 vim /etc/my.cnf [mysqld]##错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生的错误信息&#xff0c;默认已开启 log-error/usr/local/mysql/data/mysql_…

Python从入门到网络爬虫、自动化

可以创建C、C#、Python、Golang、Java、React、Node、Vue、PHP项目 创建Java项目 创建Python项目 简单if……else……语句 # 简单的if……else……语句 state True if state:print("状态正常") else:print("状态异常")# 复杂的if……elif……语句 score …

基于 LangChain + GLM搭建知识本地库

一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 受GanymedeNil的项目document.ai和AlexZhangji创建的ChatGLM-6B Pull Request启发&#xff0c;建立了全流程可使用开源模…

【Linux C | 文件I/O】文件数据的同步 | sysc、fsync 和 fdatasync 函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

电压,电流,温度采样检测原理

电流采集电路&#xff1a; 电流采样原理&#xff1a; 电压采样电路&#xff1a; 温度检测&#xff1a;通过热敏电阻实现 以上资料来源于&#xff1a;正点原子&#xff0c;仅做学习笔记使用