strlen函数详解

🎈个人主页:甜美的江
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:c语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

strlen函数详解

    • 一 函数详细介绍
    • 二 注意事项
      • 2.1 Null 结尾字符串:
      • 2.2 不适用于未初始化指针
      • 3.3 注意字符数组长度:

引言:

在 C 语言中,strlen() 函数是一个非常常用的函数,用于计算字符串的长度,即字符串中字符的个数,但不包括空字符(‘\0’)。尽管
strlen() 看起来很简单,但它实际上涉及到一些重要的概念和技巧。本文将深入探讨 strlen()
函数的工作原理、使用方法以及一些常见的注意事项,帮助读者更好地理解和使用这个函数。

一 函数详细介绍

函数原型:

size_t strlen(const char *str);

功能:

strlen() 函数用于获取字符串的长度,即字符串中字符的个数,不包括字符串末尾的空字符(\0)。

参数:

str 是一个指向以null结尾的字符串的指针。

返回值:

返回字符串的长度,类型为 size_t。

size_t 是一种用于表示内存大小的数据类型,通常用于存储对象的大小、数组的索引和内存分配函数的返回值等。它是 C 和 C++ 标准库中定义的一种数据类型。

在不同的系统架构和编译器中,size_t 的大小可能会有所不同,但通常被定义为无符号整数类型。它的大小足以保证能够存储系统中最大可能的对象的大小。

代码示例:

#include <string.h>
#include <stdio.h>int main()
{char str[] = "Hello, World!";size_t length = strlen(str);printf("Length of the string: %zu\n", length);return 0;
}

代码结果:

Length of the string: 13

这表示字符串 “Hello, World!” 中有 13 个字符(不包括末尾的空字符\0)。

代码分析:(给小白看的,高手可跳过。)

#include <string.h>

包含C语言标准库中与字符串操作相关的头文件,其中包含了 strlen() 函数的声明。

#include <stdio.h

包含C语言标准库中与标准输入输出相关的头文件,其中包含了 printf() 函数的声明。

int main()

定义程序的主函数,程序从这里开始执行。

char str[] = "Hello, World!";

定义一个字符数组 str 并将其初始化为字符串 “Hello, World!”。这创建了一个以 null 字符(\0) 结尾的字符串。

size_t length = strlen(str);

使用 strlen() 函数获取字符串 str 的长度,将结果存储在 length 变量中。

printf("Length of the string: %zu\n", length);

使用 printf() 函数输出字符串的长度,使用 %zu 格式符打印 size_t 类型的变量 length。

这一行语句会在控制台打印出字符串 "Length of the string: " 后跟着字符串长度的数值。

return 0;

表示程序正常结束,返回0作为退出状态码。

二 注意事项

2.1 Null 结尾字符串:

strlen() 函数用于获取以 null 结尾的字符串的长度。因此,字符串必须以 null 字符(\0)结尾,这是因为 strlen() 函数在检索字符串长度时,只有检索到\0时,才会停下,否则结果可能不符合预期。

代码示例:

#include <string.h>
#include <stdio.h>int main() {// 没有以 null 结尾的字符串char str[] = {'H', 'e', 'l', 'l', 'o'};// 使用 strlen() 获取字符串长度size_t length = strlen(str);printf("Length of the string: %zu\n", length);return 0;
}

在这个例子中,字符数组 str 没有以 null 字符(\0) 结尾,因此调用 strlen() 函数时会导致未定义行为。

运行结果:

Length of the string: 32

这个结果不符合预期,因为 str 字符串没有以 null 字符(\0) 结尾,导致 strlen() 函数在寻找字符串结束位置时出现了不确定的行为。

2.2 不适用于未初始化指针

strlen() 函数不适用于未初始化的指针,因为它依赖于找到 null 字符(\0) 来确定字符串的结束位置。未初始化的指针可能指向任意内存位置,导致不可预测的结果。
代码示例:

#include <string.h>
#include <stdio.h>int main()
{// 未初始化的指针char *uninitializedPtr;// 使用 strlen() 获取未初始化指针指向的字符串长度size_t length = strlen(uninitializedPtr);printf("Length of the string: %zu\n", length);return 0;
}

在这个例子中,指针 uninitializedPtr 没有被初始化,它的值是不确定的,可能指向任意内存位置。

代码结果:

Segmentation fault (core dumped)

这个结果是因为 strlen() 函数尝试在 uninitializedPtr 指向的内存中寻找 null 字符(\0) 来确定字符串的结束位置,但由于指针未初始化,它可能指向任意位置,导致在寻找 null 字符时发生段错误。

这强调了在使用 strlen() 函数之前确保指针指向已初始化的字符串。

3.3 注意字符数组长度:

如果使用字符数组存储字符串,确保数组足够长以容纳字符串及其 null 终止符。否则,可能会发生缓冲区溢出的情况。

代码示例

#include <string.h>
#include <stdio.h>int main() {// 字符数组长度不足以容纳字符串 "Hello, World!" 及其 null 终止符char str[5] = "Hi";// 使用 strlen() 获取字符串长度size_t length = strlen(str);// 输出字符串长度printf("Length of the string: %zu\n", length);return 0;
}

在这个例子中,字符数组 str 的长度为5,而不足以容纳字符串 “Hello, World!” 及其 null 终止符。因此,使用 strlen() 函数获取字符串长度时可能会导致访问超出数组长度的内存,导致未定义的行为。

代码结果:

Length of the string:

由于字符数组长度不足以容纳字符串及其 null 终止符,strlen() 函数在查找字符串结束位置时会访问未分配的内存,导致未定义的行为。

这强调了在使用 strlen() 函数时,必须确保字符数组足够长以容纳整个字符串及其 null 终止符。

总结:

在本文中,我们对 strlen() 函数进行了详细的探讨和解释。我们首先介绍了 strlen() 函数的基本工作原理,它通过查找字符串中的 null 终止符(‘\0’) 来确定字符串的长度。

然后,我们讨论了使用 strlen() 函数的注意事项,例如避免在未初始化指针或长度不足的字符数组上使用 strlen() 函数。

希望本文能够帮助读者更加熟练地使用这个函数,并在实际编程中避免一些常见的错误和陷阱。

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是甜美的江,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

动态微信小程序码和开发者工具解析小程序码

一、动态生成微信小程序码 1、方式一 微信官方网站&#xff0c;对已发布的小程序&#xff0c;提供了一个快捷的入口&#xff0c;输入微信小程序的page页面即可。 page页面可以通过右侧开启入口获取 也可以通过开发者工具左下角的页面地址和参数地址那里获取到 二、生成的小…

【软件设计师笔记】计算机系统基础知识考点

【考证须知】IT行业高含金量的证书(传送门) &#x1f496; 【软件设计师笔记】程序语言设计考点(传送门) &#x1f496; 【软件设计师笔记】操作系统考点(传送门) &#x1f496; &#x1f413; 计算机系统组成 计算机系统是由硬件和软件组成的&#xff0c;它们协同工作来运…

WAF 无法防护的八种风险

一、目录遍历漏洞 测试用例&#xff1a;Apache 目录遍历漏洞 测试环境搭建&#xff1a; apt intsall apache2 && cd /var/www/html/ && rm index.html无法拦截原因&#xff1a; 请求中无明显恶意特征&#xff0c;无法判断为攻击行为 实战数据&#xff1a; 截…

MongoDB聚合操作

文章目录 聚合操作单一作用聚合聚合管道什么是 MongoDB 聚合框架管道&#xff08;Pipeline&#xff09;和阶段&#xff08;Stage&#xff09;常用的管道聚合阶段聚合表达式数据准备$project$match$count$group accumulator操作符$unwind$limit$skip$sort$lookup案例聚合操作案例…

【机器学习】AAAI 会议论文聚类分析

实验五&#xff1a;AAAI 会议论文聚类分析 ​ 本次实验以AAAI 2014会议论文数据为基础&#xff0c;要求实现或调用无监督聚类算法&#xff0c;了解聚类方法。 1 任务介绍 ​ 每年国际上召开的大大小小学术会议不计其数&#xff0c;发表了非常多的论文。在计算机领域的一些大…

K8s 集群可观测性-数据分流最佳实践

简介 在微服务架构下&#xff0c;一个 k8s 集群中经常会部署多套业务&#xff0c;同时也意味着不同团队、不同角色、不同的业务会在同一集群中&#xff0c;需要将不同业务的数据在不同的空间进行管理和查看。 在传统的主机环境下&#xff0c;这个是可以通过不同的主机部署 Da…

《元梦之星》赛季更新带来“新”内容,为何却被玩家集体声讨?

前段时间&#xff0c;《元梦之星》迎来了“山海奇遇”赛季的重磅更新&#xff0c;诸多“新”内容的上线吸引了很多玩家们的关注&#xff0c;然而在新版本开启之后没有多&#xff0c;新玩法新时装甚至是游戏中的新改动都引起了不少玩家的不满。 在新赛季开启之后&#xff0c;玩家…

Python爬虫http基本原理

HTTP 基本原理 在本节中&#xff0c;我们会详细了解 HTTP 的基本原理&#xff0c;了解在浏览器中敲入 URL 到获取网页内容之间发生了什么。了解了这些内容&#xff0c;有助于我们进一步了解爬虫的基本原理。 2.1.1 URI 和 URL 这里我们先了解一下 URI 和 URL&#xff0c;URI…

抖音弹幕直播玩法汉字找不同文字找不同无人值执守自动玩游戏自带语音播报的开发日志

#找不同# 要解决如下几个问题&#xff1a; 1.声音sprite的录制和调用&#xff0c;解决方案以及解决库如下&#xff1a; howler.min.js://一款不错的音频播放js库。 2.鼠标自动飘浮,使用的库 anime.min.js 3.资源预加载 preload.min.js 4.其它使用到的库 jquery,vue

stack和queue及优先级队列和适配器(包括deque)的介绍

stack stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供一组…

Android使用ScrollView导致鼠标点击事件无效

平台 测试平台: RK3288 Android8.1RK3588 Android 12 问题 首先, 这个问题的前提是, 使用的输入设备是**鼠标**, 普通的触摸屏并不会出现这个问题. 大致的流程是APP的UI布局中采用ScrollView作为根容器, 之后添加各类子控件, 在一起准备就绪后, 使用鼠标进行功能测试, 出现…

国产隔离芯片的质量控制与发展趋势

随着电子技术的飞速发展&#xff0c;国产隔离芯片在电力电子、通信设备等领域中扮演着重要角色。然而&#xff0c;随之而来的是对于其质量控制的迫切需求。本文将从结构、制造工艺、测试手段等方面对国产隔离芯片的质量控制进行分析&#xff0c;并展望其未来的发展趋势。 一、国…

element-ui link 组件源码分享

link 组件的 api 涉及的内容不是很多&#xff0c;源码部分的内容也相对较简单&#xff0c;下面从以下这三个方面来讲解&#xff1a; 一、组件结构 1.1 组件结构如下图&#xff1a; 二、组件属性 2.1 组件主要有 type、underline、disabled、href、icon 这些属性&#xff0c;…

KVM-安装-使用-迁移

一. KVM安装 1. 基础安装 # 下载源 curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 安装基础软件 yum -y install tree vim wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip nc nmap …

批量修改文件后缀名

需要将/opt/module/test/路径下的txt文件后缀修改为cpp&#xff0c;并且以年份结尾 代码如下&#xff1a; #!/bin/bashyear2020 directory"/opt/module/test/"cd "$directory" || exit 1for name in *.txt; donew_name"${name%.txt}_${year}.cpp&qu…

SpringBoot security 安全认证(一)——登录验证

本节内容&#xff1a;使用springboot自动security模块实现用户登录验证功能&#xff1b; 登录过程如下图&#xff1a; AuthenticationManager内容实现用户账号密码验证&#xff0c;还可以对用户状态&#xff08;启用/禁用&#xff09;&#xff0c;逻辑删除&#xff0c;账号是否…

LeetCode.189. 轮转数组

题目 题目链接 分析 首先能想到的就是可以用一个新数组&#xff0c;先保存原数组的后 k 个元素&#xff0c;再保存原数组的前 n−k 个元素。但题目要求不使用额外的数组空间&#xff0c;那么就需要在原数组上做操作。 我们可以先把整个数组翻转一下&#xff0c;这样后半段元…

虚幻UE5Matehuman定制自己的虚拟人,从相机拍照到UE5制作全流程

开启自己的元宇宙,照片扫描真实的人类,生成虚拟形象,保姆级教程,欢迎大家指正。 需要的软件: 制作流程: 一.拍照。 围绕自己拍照,大概20多张图就差不多了,把脑门漏出来,无需拍后脑勺。 拍照方式 例如,拍照时尽量不要在脸上体现出明显的光源方向。

07. 【Linux教程】远程登录

Linux 远程登录 前面介绍了如何安装 Linux 终端工具&#xff0c;本小节介绍本地电脑如何使用 ssh 命令远程登录、Linux 终端工具远程登录的方式&#xff0c;这两种登录方式都是基于 ssh 网络安全协议的&#xff0c;学会使用远程登录 Linux 服务器&#xff0c;会让你对 Linux 系…

Postman(接口测试工具),什么是Postman接口

目录 一.基本介绍 Postman 是什么Postman 快速入门快速入门需求说明 二.Postman 完成 Controller 层测试 需要的代码&#xff1a; Java类request.jspsuccess.jsp1. 完成请求2. 完成请求3. 完成请求4. 完成请求5. 完成请求 三.发送join 目录 一.基本介绍 Postman 是什么 …