自定义 strlen 函数:递归实现字符串长度计算
目录
自定义 strlen 函数:递归实现字符串长度计算
一.引言
二.代码呈现
三.代码结构与功能概述
1.自定义 my_strlen 函数
1.函数参数与功能
2.代码逻辑分析
1.参数有效性检查:
2.递归计算字符串长度:
2.main 函数
1.变量定义
2.函数调用与输出
四.总结
自定义 strlen 函数:递归实现字符串长度计算
一.引言
在 C 语言编程的世界里,字符串处理是极为常见的操作,而计算字符串的长度是其中一项基础且重要的任务。标准库中提供了 strlen 函数来实现这一功能,不过我们也可以通过自定义函数来加深对字符串处理和递归算法的理解。下面我们将详细分析一段自定义的 my_strlen 函数代码,探讨其实现原理、代码逻辑、应用场景。
二.代码呈现
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* ch) {assert(ch != NULL);if (*ch != '\0') {return 1 + my_strlen(ch + 1);}elsereturn 0;
}
int main() {char arr[] = "hello world";printf("%zd\n", my_strlen(arr));return 0;
}
三.代码结构与功能概述
这段代码主要由两部分构成:自定义的 my_strlen 函数和 main 函数。my_strlen 函数的核心功能是计算传入字符串的长度,而 main 函数则负责调用 my_strlen 函数并输出计算结果。
1.自定义 my_strlen 函数
size_t my_strlen(const char* ch) {assert(ch != NULL);if (*ch != '\0') {return 1 + my_strlen(ch + 1);}elsereturn 0;
}
1.函数参数与功能
my_strlen 函数接受一个指向常量字符的指针 ch 作为参数,该指针指向要计算长度的字符串。函数返回一个 size_t 类型的值,用于表示字符串的长度。size_t 是一种无符号整数类型,通常用于表示对象的大小或数组的长度,确保可以处理足够大的字符串长度。
2.代码逻辑分析
1.参数有效性检查:
assert(ch != NULL);
使用 assert 宏对传入的指针进行有效性检查。如果 ch 为 NULL,程序会触发断言错误并终止执行。这一步骤的目的是避免因空指针访问而导致的程序崩溃,增强了代码的健壮性。
2.递归计算字符串长度:
if (*ch != '\0') {return 1 + my_strlen(ch + 1);
}
elsereturn 0;
这是函数的核心逻辑,采用递归的方式计算字符串的长度。具体来说:
- 首先检查当前指针
ch所指向的字符是否为字符串结束符'\0'。如果不是结束符,说明字符串还未结束,此时函数返回1加上递归调用my_strlen(ch + 1)的结果。1表示当前字符,my_strlen(ch + 1)则是计算从当前字符的下一个字符开始的字符串长度。 - 如果当前指针
ch所指向的字符是结束符'\0',说明已经到达字符串的末尾,此时函数返回0。
2.main 函数
int main() {char arr[] = "hello world";printf("%zd\n", my_strlen(arr));return 0;
}
1.变量定义
char arr[] = "hello world";
定义了一个字符数组 arr,并初始化为 "hello world" 字符串。这个数组将作为参数传递给 my_strlen 函数进行长度计算。
2.函数调用与输出
printf("%zd\n", my_strlen(arr));
调用 my_strlen 函数计算 arr 数组中字符串的长度,并使用 printf 函数将结果输出。%zd 是 printf 函数用于输出 size_t 类型值的格式说明符,\n 表示换行符,使输出结果更加清晰易读。
四.总结
这段自定义的 my_strlen 函数适用于对字符串长度进行简单计算的场景,尤其适合在学习递归算法和字符串处理时使用。通过递归的方式,我们可以更深入地理解函数调用栈的工作原理和递归思想的应用。
相关文章:
自定义 strlen 函数:递归实现字符串长度计算
目录 自定义 strlen 函数:递归实现字符串长度计算 一.引言 二.代码呈现 三.代码结构与功能概述 1.自定义 my_strlen 函数 1.函数参数与功能 2.代码逻辑分析 1.参数有效性检查: 2.递归计算字符串长度: 2.main 函数 1.变量定义 2.函…...
LeetCode 打家劫舍+删除并获得点数
题目描述 打家劫舍题目传送门1 删除并获得点数传送门2 思路 这两道题看似毫无关系,但竟然可以用桶数组联系起来!! 先说打家劫舍这道题 限制条件是不能走相邻的屋,再联想到跳台阶(走一格或两格)&#x…...
图解MCP:Model Context Protocol
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
【网络】数据链路层知识梳理
全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的笔记吧~ 自己写自己的八股!让未来的自己看懂! (全文手敲,受益良多) 数据链路层 我们来重新理解一下这个图:…...
积木报表查询出现jdbc.SQLServerException: 对象名 ‘user_tab_comment 的解决方法
目录 前言1. 问题所示2. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 使用帆软报表无错,后续使用积木报表查询出错: 没有显示报表: 具体错误信息如下:...
数字孪生废气处理工艺流程
图扑数字孪生废气处理工艺流程系统。通过精准 3D 建模,对废气收集、预处理、净化、排放等全流程进行 1:1 数字化复刻,实时呈现设备运行参数、污染物浓度变化等关键数据。 借助图扑可视化界面,管理者可直观掌握废气处理各环节状态,…...
【某比特币网址请求头部sign签名】RSA加密逆向分析
目标:aHR0cDovL21lZ2FiaXQudmlwL21hcmtldA 直接搜索sign不方便定位,可以换个思路搜asi_uuid或者user_info 为什么搜这个,因为都是请求头里面的参数,基本上会在一起 实际上就是Object(h.a)((new Date).getTime()) 直接在这里打断点…...
基于WebRTC技术的EasyRTC:支持任意平台设备的实时音视频通信解决方案
一、技术架构与核心优势 EasyRTC是一套基于WebRTC技术的实时音视频通信框架,旨在为开发者提供高效、稳定、跨平台的通信解决方案。其核心优势在于支持任意平台设备,包括Web端、移动端、桌面端和嵌入式设备,真正实现“一次开发,多…...
DNS解析失败怎么解决?
在互联网时代,畅快地浏览网页、使用各类网络服务已成为生活常态。然而,当屏幕突然弹出 “DNS解析失败”的提示,原本顺畅的网络连接戛然而止,让人倍感困扰。DNS即域名系统,它如同互联网的 “电话簿”,负责将…...
2025年4月19日
1.英语 1.单词 2.翻译 老年人食堂 In recent years, elderly population in China has continued to grow. The Chinese government is taking various measures to advance the construction of the elderly care service system and to make the later lives of the elde…...
FastGPT安装前,系统环境准备工作?
1.启用适用于 Linux 的 Windows 子系统 方法一:打开控制面板 -> 程序 -> 启用或关闭Windows功能->勾选 “适用于Linux的Vindows子系统” 方法二:以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell” >单击右键 >“…...
从零起步的Kaggle竞赛 - BirdCLEF2025
一个优秀的coder,先从CV工程开始...... 首先复制了 LB 0.804- EfficientNet B0 Pytorch Pipeline | Kaggle 这个notebook并尝试提交(Kaggle的notebook中包括参赛者训练好的模型,所以本次提交只能熟悉一下流程而已),ok…...
【Vue】组件通信(Props/Emit、EventBus、Provide/Inject)
个人主页:Guiat 归属专栏:Vue 文章目录 1. Props/Emit 父子组件通信1.1 Props 向下传递数据1.2 Emit 向上传递事件 2. EventBus 跨组件通信2.1 创建事件总线2.2 使用事件总线2.3 EventBus 优缺点 3. Provide/Inject 深层组件通信3.1 基本使用3.2 响应式处…...
electron打包是没有正确生成electron.exe,x ENOENT: no such file or directory, rename:
情况一 arch配置错误,最好根据自己的电脑架构配置 win: {target: [{target: "nsis", arch: ["x64"],},],artifactName: "${productName}_${version}.${ext}",}, 情况二、 electron没有被正确下载,可以翻墙重新通过npm…...
立体匹配模型RAFT-Stereo的onnx导出与trt使用指南
这里写目录标题 如何将 RAFT-Stereo 模型导出为 ONNX 格式转化为静态的模型:转化为动态的模型:reference通过将 RAFT-Stereo 模型转换为 ONNX 格式,我们能够在不同的推理引擎和硬件平台上高效地部署和运行该模型,而无需依赖原始的 PyTorch 环境。这为在实际应用中使用 RAFT…...
C++数组栈与链表栈
数组栈 #include <iostream> using namespace std; class mystack{ private:int dat[1000];int curr0; public:void push(int);void pop();int top();bool empyt();int size(); }; void mystack::push(int b){if(curr<1000){dat[curr]b;curr;} } void mystack::pop()…...
QT实现串口透传的功能
在一些产品的开发的时候,需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…...
动态规划入门:背包问题求具体方案(以0-1背包问题为例)
本质:有向图最短(长)路问题 字典序最小方案?--贪心思路?(本题未使用) 分析第一个物品: 写代码时tip:要考虑“边读边做”还是“先读后做” #include<iostream> #i…...
WEMOS LOLIN32 开发板引脚布局和技术规格
🔗 快速链接ESP32 Development Boards, Sensors, Tools, Projects and More https://megma.ma/wp-content/uploads/2021/08/Wemos-ESP32-Lolin32-Board-BOOK-ENGLISH.pdf WEMOS LOLIN32 Development Board Details, Pinout, Specs WEMOS LOLIN32 Development Board …...
mysql中的group by用法详解
MySQL中的GROUP BY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算。以下从基本语法到高级用法进行详细解析: 一、基本语法与核心功能 SELECT 分组列, 聚合函数(计算列) FROM 表名 [WHERE 条件] GROUP B…...
java基础从入门到上手(九):Java - List、Set、Map
一、List集合 List 是一种用于存储有序元素的集合接口,它是 java.util 包中的一部分,并且继承自 Collection 接口。List 接口提供了多种方法,用于按索引操作元素,允许元素重复,并且保持插入顺序。常用的 List 实现类包…...
从malloc到free:动态内存管理全解析
1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有: int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点: 1.空间开辟的时候大小已经固定 2.数组…...
AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(上)
欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 根据上一篇内容中…...
ubuntu22.04安装dukto
1.添加源 sudo add-apt-repository ppa:xuzhen666/dukto2.进行更新和安装 sudo apt update sudo apt install dukto3.报错 $ sudo apt install dukto 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 您也许需要…...
【数据库】事务
目录 1. 什么是事务? 2. 事务的ACID特性 3. 为什么使用事务? 4. 如何使用事务 4.1 查看支持事务的存储引擎 4.2 语法 4.3 保存点 4.4 自动/手动提交事务 5. 事物的隔离性和隔离级别 5.1 什么是隔离性 5.2 隔离级别 5.3 查看和设置隔离级别 1…...
使用Redis实现实时排行榜
为了实现一个实时排行榜系统,我们可以使用Redis的有序集合(ZSet),其底层通常是使用跳跃表实现的。有序集合允许我们按照分数(score)对成员(member)进行排序,因此非常适合…...
QML中的3D功能--入门开发
Qt Quick 提供了强大的 3D 功能支持,主要通过 Qt 3D 模块实现。以下是 QML 中开发 3D 应用的全面指南。 1. 基本配置 环境要求 Qt 5.10 或更高版本(推荐 Qt 6.x) 启用 Qt 3D 模块 支持 OpenGL 的硬件 项目配置 在 .pro 文件中添加: QT += 3dcore 3drender 3dinput 3dex…...
6. 字符串
1.反转字符串 2.替换数字 3.反转字符串中的单词 4.KMP算法 5.重复的子字符串(看具体证明) 太6了(真不是人做的)...
000.初识 dyld
dyld(Dynamic Link Editor) 是 Apple 操作系统的动态加载器/链接器。 在 iOS 或 iPadOS 启动一个 Mach‑O 可执行文件时,dyld 会: 解析可执行文件头,确认 CPU 架构、地址空间布局随机化(ASLR)参…...
Redis ④-通用命令
Redis 是一个 客户端-服务器 结构的程序,这与 MySQL 是类似的,这点需要牢记!!! Redis 固然好,但也不是任何场景都适合使用 Redis,一定要根据当前的业务需求来选择是否使用 Redis Redis 通用命令…...
