从入门到实战:C 语言 strlen 函数通关指南
文章目录
- 一、strlen函数简介
- 1. 函数构成
- 2. 参数说明
- 3. 使用示例
- 二、模拟实现strlen函数(从新手角度逐步升级改进)
- 1. 基础版本(利用循环计数)
- 2. 改进版本(利用指针相减)
- 3. 递归版本(利用递归思想)
一、strlen函数简介
strlen函数是C语言标准库<string.h>中用于计算字符串长度的一个非常常用的函数。
1. 函数构成
它的函数声明一般为:size_t strlen(const char *str);。这里的size_t是一种无符号整数类型(通常在不同的系统中被定义为unsigned int或者unsigned long等,取决于具体的编译器和平台,目的是为了能够合适地表示内存相关的大小值),用于返回字符串的长度。函数名是strlen,参数部分是const char *str,这表示函数接收一个指向字符常量的指针,也就是指向一个以'\0'作为结束标志的字符串的首地址。
2. 参数说明
参数str就是要计算长度的字符串的指针。例如,我们有一个字符串char str[] = "hello";,当调用strlen(str)时,就是把这个字符串str的首地址传递给strlen函数,让它去计算这个字符串从首字符开始到遇到'\0'为止的字符个数(不包含'\0'本身)。
3. 使用示例
以下是一个简单的使用strlen函数的代码示例:
#include <stdio.h>
#include <string.h>int main() {char str[] = "hello world";size_t len = strlen(str);printf("字符串 \"%s\" 的长度是 %zu\n", str, len);return 0;
}
在上述代码中,首先定义了一个字符串str,然后调用strlen函数计算其长度,并将结果存储在len变量中,最后输出字符串以及它的长度。输出结果会是:字符串 "hello world" 的长度是 11。
二、模拟实现strlen函数(从新手角度逐步升级改进)
1. 基础版本(利用循环计数)
对于刚接触C语言的新手来说,可能首先想到的是利用一个循环去遍历字符串,每遍历一个字符就计数一次,直到遇到字符串结束标志'\0'为止。以下是代码实现:
#include <stdio.h>// 模拟实现strlen函数的基础版本
size_t my_strlen_1(const char *str){size_t count = 0;while (*str!= '\0') {count++;str++;}return count;
}int main()
{char str[] = "hello";size_t len = my_strlen_1(str);printf("模拟实现的字符串 \"%s\" 的长度是 %zu\n", str, len);return 0;
}
在这个版本中,定义了一个size_t类型的变量count用于计数。通过while循环,只要当前指针所指向的字符不是'\0',就将count加1,并且将指针向后移动一位(通过str++实现),当遇到'\0'时,循环结束,返回计数的结果也就是字符串的长度。
2. 改进版本(利用指针相减)
稍微进阶一点,我们可以利用指针相减的方式来实现。在C语言中,两个指针相减的结果是它们之间元素的个数(前提是这两个指针指向同一个数组中的元素)。
#include <stdio.h>// 模拟实现strlen函数的改进版本(利用指针相减)
size_t my_strlen_2(const char *str) {const char *p = str;while (*p!= '\0') {p++;}return (size_t)(p - str);
}int main()
{char str[] = "hello";size_t len = my_strlen_2(str);printf("改进模拟实现的字符串 \"%s\" 的长度是 %zu\n", str, len);return 0;
}
在这个版本里,首先定义了一个指针p并让它也指向字符串的开头(和str指向相同位置),然后通过循环让p向后移动直到指向'\0',最后返回p和str两个指针相减的结果(注意要将结果强制转换为size_t类型,以符合strlen函数的返回值类型要求),这样就得到了字符串的长度。
3. 递归版本(利用递归思想)
再进一步,我们可以用递归的方式来模拟实现strlen函数。递归的基本思路就是把一个大问题逐步分解成更小的相同类型的子问题,直到达到某个终止条件。
#include <stdio.h>// 模拟实现strlen函数的递归版本
size_t my_strlen_3(const char *str){if (*str == '\0') {return 0;}return 1 + my_strlen_3(str + 1);
}int main(){char str[] = "hello";size_t len = my_strlen_3(str);printf("递归模拟实现的字符串 \"%s\" 的长度是 %zu\n", str, len);return 0;
}
在这个递归版本中,首先判断当前指针所指向的字符是否为'\0',如果是,就返回0,表示字符串长度为0了,这就是递归的终止条件。如果不是'\0',那就说明字符串还有长度,返回1(表示当前这个非'\0'字符算一个长度)加上后面剩余字符串的长度(通过递归调用my_strlen_3(str + 1)来计算,也就是把指针向后移动一位去计算剩余部分的长度),这样不断递归下去,最终就能算出整个字符串的长度。
通过这样从简单到复杂、从基础到进阶的方式,新手可以逐步深入理解strlen函数的实现原理以及相关的编程技巧和思想。
相关文章:
从入门到实战:C 语言 strlen 函数通关指南
文章目录 一、strlen函数简介1. 函数构成2. 参数说明3. 使用示例 二、模拟实现strlen函数(从新手角度逐步升级改进)1. 基础版本(利用循环计数)2. 改进版本(利用指针相减)3. 递归版本(利用递归思…...
npm install --global windows-build-tools --save 失败
注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …...
十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)
学习了十种常见的排序方法,此文章针对所学的排序方法进行整理(通过C语言完成排序)。 参考内容: https://blog.csdn.net/mwj327720862/article/details/80498455 https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 1. 冒…...
基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
一、前言 笔者之前的文章《基于Dpabi和spm12的脑脊液(csf)分割和提取笔记》,介绍了如何从普通的fMRI数据中提取CSF信号。首先是基础的预处理,包括时间层校正、头动校正,再加上0.01-0.1Hz的带通滤波。接着用SPM12分割出CSF区域,设置一个比较严格的0.9阈值,确保提取的真是…...
实现websocket心跳检测,断线重连机制
WebSocket基础 WebSocket概念 WebSocket是一种革命性的 全双工通信协议 ,构建在TCP之上,旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接,WebSocket实现了真正的双向实时通信,显著提高了交互效率。这一特性…...
ComfyUI节点安装笔记
AI高速发展,版本更新相当快(11月25日才安装的版本v.0.3.4,27日版本就已经更新到v.0.3.5了),在遇到问题,找到问题原因所在的过程中,ComfyUI版本、python版本、节点对环境版本的依赖,本…...
深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题
在训练过程中,训练集的准确率稳步上升,但是验证集的准确率一直在40%左右徘徊,从网上搜索可能的原因有: 1、学习率太小,陷入局部最优。 2、数据量太小(4000多条数据,应该还可以吧) …...
【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 1、switch 结构基本语法 2、示例代码及解释 3、使用注意事项 4、判断闰年的条件 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:编写程序实现:从键盘上输入一个年月日(以空格或回车…...
Lumos学习王佩丰Excel二十四讲系列完结
“Lumos学习王佩丰Excel二十四讲系列”是一套完整的Excel教程,涵盖了从基础到高级的各种知识和技能。是我亲自一个个码出来的教程哇!!! 一、课程概览 该教程共分为24讲,每一讲都围绕Excel的一个核心主题进行深入讲解…...
前后端规约
文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...
【数据可视化】数据可视化看板需求梳理模板(含示例)
一、模板 设计一个数据可视化看板需要从多个方面梳理需求,以确保看板能够有效地传达信息并满足用户的需求。以下是一些关键方面: 1.目标和受众 ● 明确目标:确定看板的主要目的,例如监控业务指标、分析市场趋势、展示项目进度等…...
CArray原理是什么,通过示例来展示如何使用?
CArray是MFC(Microsoft Foundation Class)库中的一个模板类,用于实现动态数组的功能。它类似于C语言中的数组,但具有自动增长和缩小的能力,从而方便管理动态数据。以下是对CArray原理的解析以及一个使用示例。 CArray…...
更换WordPress主题的基础知识及注意事项
更换WordPress主题是优化和升级网站的重要步骤,不仅能够增强网站的视觉效果,还能改进用户体验并提高网站性能。然而,在进行该操作时,必须格外谨慎,避免数据丢失或功能失调的风险。本文将介绍在更换主题前需要采取的基本…...
springcloud篇3-docker需熟练掌握的知识点
docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充:配置镜像源 注意: yum安装是在线联网下载安装,而很多的资源…...
基于单片机的直流稳压电源的设计(论文+源码)
1.系统方案设计 在本次直流稳压电源的设计中,其关键指标如下: 系统输入电压220V交流系统输出直流0到12V可调,步进可以达到0.1V电流最大输出可以到2A具有短路保护功能可以通过液晶或者数码管等显示设备显示当前输出电压 2. 电路图...
uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端
采用 uniapp-vue3 实现, 是一款带有丝滑动画效果的单选框组件,提供点状、条状的动画过渡效果,支持多项自定义配置,适配 web、H5、微信小程序(其他平台小程序未测试过,可自行尝试) 可到插件市场下载尝试&…...
解锁 C 语言字符函数密码,开启高效编程之路
文章目录 一、字符函数的构成二、字符函数的分类1、字符分类函数1、isalnum函数2、isalpha函数3、isdigit函数4、islower函数5、isupper函数6、ispunct函数7、isspace函数8、iscntrl函数9、isxdigit函数10、isgraph函数11、isprint函数 2、字符转换函数 三、字符函数的应用 一、…...
LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库
一、必备条件: python语言Neo4j数据库python库:neo4j、llmsherpa、glob、dotenv 二、代码: from llmsherpa.readers import LayoutPDFReaderfrom neo4j import GraphDatabaseimport uuidimport hashlibimport osimport globfrom datetime …...
力扣-数组-01两数之和
解析 遍历i和第i1,两个for循环查就可以,时间复杂度是 代码 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ansewer;bool flag false;for(int i 0;i < nums.size(); i){for(in…...
Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
Flutter中的网络请求图片存储为缓存,与定制删除本地缓存 1:封装请求图片函数 2:访问的图片都会转为本地缓存,当相同的请求url,会在本地调用图片 3:本地缓存管理【windows与andriod已经测试】【有页面】【有…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
