从入门到实战: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已经测试】【有页面】【有…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...