当前位置: 首页 > news >正文

从入门到实战: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',最后返回pstr两个指针相减的结果(注意要将结果强制转换为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函数的实现原理以及相关的编程技巧和思想。

http://www.lryc.cn/news/516829.html

相关文章:

  • npm install --global windows-build-tools --save 失败
  • 十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)
  • 基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
  • 实现websocket心跳检测,断线重连机制
  • ComfyUI节点安装笔记
  • 深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题
  • 【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】
  • Lumos学习王佩丰Excel二十四讲系列完结
  • 前后端规约
  • 【数据可视化】数据可视化看板需求梳理模板(含示例)
  • CArray原理是什么,通过示例来展示如何使用?
  • 更换WordPress主题的基础知识及注意事项
  • springcloud篇3-docker需熟练掌握的知识点
  • 基于单片机的直流稳压电源的设计(论文+源码)
  • uniapp-vue3 实现, 一款带有丝滑动画效果的单选框组件,支持微信小程序、H5等多端
  • 解锁 C 语言字符函数密码,开启高效编程之路
  • LLM之RAG实战(五十一)| 使用python和Cypher解析PDF数据,并加载到Neo4j数据库
  • 力扣-数组-01两数之和
  • Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
  • 保障移动应用安全:多层次安全策略应对新兴威胁
  • 【Linux】函数
  • Maven中管理SNAPSHOT版本含义及作用
  • win10 VS2019上libtorch库配置过程
  • 【计算机网络】课程 实验二 交换机基本配置和VLAN 间路由实现
  • Oracle Dataguard(主库为单节点)配置详解(4):将主库复制到备库并启动同步
  • OpenCL(贰):浅析CL内核程序接口函数
  • Leetcode 3407. Substring Matching Pattern
  • 学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用
  • Vue笔记-001-声明式渲染
  • 26考研资料分享 百度网盘