自定义 strlen 函数:递归实现字符串长度计算

news2025/4/21 10:40:59

目录

自定义 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);
    }
    else
        return 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);
    }
    else
        return 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);
}
else
    return 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 函数适用于对字符串长度进行简单计算的场景,尤其适合在学习递归算法和字符串处理时使用。通过递归的方式,我们可以更深入地理解函数调用栈的工作原理和递归思想的应用。

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

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

相关文章

LeetCode 打家劫舍+删除并获得点数

题目描述 打家劫舍题目传送门1 删除并获得点数传送门2 思路 这两道题看似毫无关系&#xff0c;但竟然可以用桶数组联系起来&#xff01;&#xff01; 先说打家劫舍这道题 限制条件是不能走相邻的屋&#xff0c;再联想到跳台阶&#xff08;走一格或两格&#xff09;&#x…

图解MCP:Model Context Protocol

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

【网络】数据链路层知识梳理

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的笔记吧~ 自己写自己的八股&#xff01;让未来的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 数据链路层 我们来重新理解一下这个图&#xff1a;…

积木报表查询出现jdbc.SQLServerException: 对象名 ‘user_tab_comment 的解决方法

目录 前言1. 问题所示2. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 使用帆软报表无错,后续使用积木报表查询出错: 没有显示报表: 具体错误信息如下:

数字孪生废气处理工艺流程

图扑数字孪生废气处理工艺流程系统。通过精准 3D 建模&#xff0c;对废气收集、预处理、净化、排放等全流程进行 1:1 数字化复刻&#xff0c;实时呈现设备运行参数、污染物浓度变化等关键数据。 借助图扑可视化界面&#xff0c;管理者可直观掌握废气处理各环节状态&#xff0c…

【某比特币网址请求头部sign签名】RSA加密逆向分析

目标&#xff1a;aHR0cDovL21lZ2FiaXQudmlwL21hcmtldA 直接搜索sign不方便定位&#xff0c;可以换个思路搜asi_uuid或者user_info 为什么搜这个&#xff0c;因为都是请求头里面的参数&#xff0c;基本上会在一起 实际上就是Object(h.a)((new Date).getTime()) 直接在这里打断点…

基于WebRTC技术的EasyRTC:支持任意平台设备的实时音视频通信解决方案

一、技术架构与核心优势 EasyRTC是一套基于WebRTC技术的实时音视频通信框架&#xff0c;旨在为开发者提供高效、稳定、跨平台的通信解决方案。其核心优势在于支持任意平台设备&#xff0c;包括Web端、移动端、桌面端和嵌入式设备&#xff0c;真正实现“一次开发&#xff0c;多…

DNS解析失败怎么解决?

在互联网时代&#xff0c;畅快地浏览网页、使用各类网络服务已成为生活常态。然而&#xff0c;当屏幕突然弹出 “DNS解析失败”的提示&#xff0c;原本顺畅的网络连接戛然而止&#xff0c;让人倍感困扰。DNS即域名系统&#xff0c;它如同互联网的 “电话簿”&#xff0c;负责将…

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…

【Vue】组件通信(Props/Emit、EventBus、Provide/Inject)

个人主页&#xff1a;Guiat 归属专栏&#xff1a;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 响应式处…

QT实现串口透传的功能

在一些产品的开发的时候&#xff0c;需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…

动态规划入门:背包问题求具体方案(以0-1背包问题为例)

本质&#xff1a;有向图最短&#xff08;长&#xff09;路问题 字典序最小方案&#xff1f;--贪心思路&#xff1f;&#xff08;本题未使用&#xff09; 分析第一个物品&#xff1a; 写代码时tip&#xff1a;要考虑“边读边做”还是“先读后做” #include<iostream> #i…

WEMOS LOLIN32 开发板引脚布局和技术规格

&#x1f517; 快速链接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是数据聚合分析的核心功能&#xff0c;主要用于将结果集按指定列分组&#xff0c;并结合聚合函数进行统计计算。以下从基本语法到高级用法进行详细解析&#xff1a; 一、基本语法与核心功能 SELECT 分组列, 聚合函数(计算列) FROM 表名 [WHERE 条件] GROUP B…

java基础从入门到上手(九):Java - List、Set、Map

一、List集合 List 是一种用于存储有序元素的集合接口&#xff0c;它是 java.util 包中的一部分&#xff0c;并且继承自 Collection 接口。List 接口提供了多种方法&#xff0c;用于按索引操作元素&#xff0c;允许元素重复&#xff0c;并且保持插入顺序。常用的 List 实现类包…

从malloc到free:动态内存管理全解析

1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有&#xff1a; int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点&#xff1a; 1.空间开辟的时候大小已经固定 2.数组…

AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(上)

欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 根据上一篇内容中…

【数据库】事务

目录 1. 什么是事务&#xff1f; 2. 事务的ACID特性 3. 为什么使用事务&#xff1f; 4. 如何使用事务 4.1 查看支持事务的存储引擎 4.2 语法 4.3 保存点 4.4 自动/手动提交事务 5. 事物的隔离性和隔离级别 5.1 什么是隔离性 5.2 隔离级别 5.3 查看和设置隔离级别 1…

使用Redis实现实时排行榜

为了实现一个实时排行榜系统&#xff0c;我们可以使用Redis的有序集合&#xff08;ZSet&#xff09;&#xff0c;其底层通常是使用跳跃表实现的。有序集合允许我们按照分数&#xff08;score&#xff09;对成员&#xff08;member&#xff09;进行排序&#xff0c;因此非常适合…

6. 字符串

1.反转字符串 2.替换数字 3.反转字符串中的单词 4.KMP算法 5.重复的子字符串&#xff08;看具体证明&#xff09; 太6了&#xff08;真不是人做的&#xff09;