C语言 strlen()函数

news2024/11/25 2:58:37

一、strlen()函数的简介

        strlen函数:计算的是字符串str的长度,从字符的首地址开始遍历,以 '\0' 为结束标志,然后将计算的长度返回,计算的长度并不包含'\0'。下面是库中的strlen()函数:

size_t  strlen (const char* str);

函数的参数为------const char* str:字符指针
返回值的类型------size_t:无符号整数(即:unsigned int)
前提知识:

const关键字:是用来定义常量的,若一个变量被const关键字修饰时,那么这个变量的值就不可以被改变。故:这里的 * str 的值是不能被修改的。
size_t数据类型:表示C中任何对象所能达到的最大长度,它是无符号整数。
   1.使用const关键字:这里只是计算字符串的长度,用const修饰,避免将原字符串修改掉。

   2.使用size_t数据类型:这里返回计算的字符串长度,长度最小值为0,不可能为负数。

二、strlen()函数的具体使用
场景一:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[10] = "abcde";
    int num = strlen(arr);
    printf("数组arr的长度为:%d\n", num);
 
    return 0;
}

输出的结果:
 

 场景二:

#include <stdio.h>
#include <string.h>
 
int main()
{
    char arr[] = { 'a','b','c','d','e' };
    int num = strlen(arr);
    printf("数组arr的长度:%d\n", num);
 
    return 0;
}

输出结果如下所示:

上述两种场景输出的结果并不相同 ,为什么会出现这样的结果,我们在用strlen函数时应该注意什么?

三、使用strlen函数的注意事项 
strlen函数:当计算长度时,只有遇到'\0'才会停止计算,同时计算的长度不包含'\0'

    场景一,arr字符数组中存储的是一个字符串(字符串是以'\0'为结束标志的),那么strlen遍历到字符 'e' 时,再向后遍历,就会遇到'\0',此时strlen停止遍历,返回字符个数:5;

    场景二:字符'a'、'b'、 'c' 、'd' 、'e'五个字符依次存储在arr的字符数组中,并没有存储'\0',所以'e'字符后面存储的内容我们并不知道有什么。而strlen函数只有遇到'\0'时才停止,所以返回的个数是一个随机值。

故:我们使用strlen函数时,应该检查字符数组是否以'\0'为结束标志。

四、实现strlen函数功能的三种方式
1.计数器的方式
代码如下:

#include <stdio.h>
#include <assert.h>
 
int count_strlen(const char* p)
{
    assert(p != NULL);
    int count = 0;
    while (*p != '\0')
    {
        count++;
        p++;
    }
    return count;
}
 
int main()
{
    char arr1[] = "abcdefg";
    int num1=count_strlen(arr1);
    printf("字符串arr1的长度为:%d\n", num1);
 
    return 0;
}

输出结果:

补充知识:assert(断言):是一个宏。

        assert 的作用是,将括号中的表达式计算出 ,如果其值为假(即为0),那么它会打印出一条出错信息,然后终止程序的运行。这里的assert是防止指针p指向为NULL。

2.递归的方式
代码如下:

#include <stdio.h>
#include <assert.h>
int recursion_strlen(char* p)
{
    assert(p != NULL);
    if (*p != '\0')
    {
        return 1 + recursion_strlen(++p);
    }
    else
    {
        return 0;
    }
}
int main()
{
    char arr2[] = "abcdef";
    int num2 = recursion_strlen(arr2);
    printf("字符串arr2的长度为:%d\n", num2);
 
    return 0;
}

输出结果:

3.指针减指针的方式
代码如下:

#include <stdio.h>
#include <assert.h>
 
int point_strlen(char* p)
{
    assert(p != NULL);
    char* start = p;
    while (*p != '\0')
    {
        p++;
    }
    return p - start;
}
int main()
{
    char arr3[] = "abcd";
    int num3 = point_strlen(arr3);
    printf("字符串arr3的长度为:%d\n", num3);
 
    return 0;
}

输出结果:

总结
        strlen()函数:返回 '\0'之前的字符个数,因此需规范初始化字符数组。 

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

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

相关文章

Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务

作者&#xff1a;刘军 全新升级的 Triple 协议 在微服务协议选型方面我们看到越来越多的应用从 Dubbo2 TCP 二进制协议迁移到 Dubbo3 Triple 协议 (兼容 gRPC)&#xff0c;以充分利用 Triple 的高效、全双工、Streaming 流式通信模型等能力&#xff1b;TripleHTTP/2 的组合很…

内存函数讲解

&#x1f495;"痛苦难以避免&#xff0c;而磨难可以选择。"-->村上春树&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据在内存中的存储 内存函数就是管理内存数据的函数&#xff0c;包含于头文件<string.h>中 1.memcpy函数-->内存…

线程池使用时需注意的一些问题

1、正确声明线程池 线程池必须手动通过 ThreadPoolExecutor 的构造函数来声明&#xff0c;避免使用Executors 类创建线程池&#xff0c;会有 OOM 风险。 Executors 返回线程池对象的弊端如下(后文会详细介绍到)&#xff1a; FixedThreadPool 和 SingleThreadExecutor &#xf…

设备JS二次开发指南

设备JS ES6二次开发 #新增设备类 在kiosk-cli-2nd的平台目录下,有摄像头二次开发增加接口示例,继承已有的摄像头类,如下图所示: 在该路径下新建一个设备js文件,如新增密码键盘的设备js:pinpad-2nd.js (1)导入平台设备js import { Device } from @/platform/lib/plat…

Android 海外版本中远程仓库无法拉取问题

在处理海外版本时 &#xff0c;经常遇到远程仓库无法加载的问题&#xff0c;是网络问题导致的。要么&#xff0c;公司运维搭建可翻墙的梯子&#xff0c;或其他的方式避开限制。 还有一种方式&#xff0c;是找到网站对应的ip &#xff0c;在host 中配置&#xff0c;便可绕开限制…

python_day14

导包 from pyspark import SparkConf, SparkContext import osos.environ["PYSPARK_PYTHON"] "D:/dev/python/python3.10.4/python.exe" conf SparkConf().setMaster("local[*]").setAppName("test_spark") sc SparkContext(confc…

【Node.js】低代码管理系统源码:只需点击鼠标,搭建属于你的企业应用

低代码管理系统是一种通过可视化界面和简化的开发工具&#xff0c;使非专业开发人员能够快速构建和管理应用程序的系统。它提供了一套预先定义的组件和模块&#xff0c;使用户可以通过拖放操作来设计应用程序的界面和逻辑。低代码管理系统还提供了自动化的工作流程、数据管理和…

策略模式的实现与应用:掌握灵活算法切换的技巧

文章目录 常用的设计模式有以下几种&#xff1a;一.创建型模式&#xff08;Creational Patterns&#xff09;&#xff1a;二.结构型模式&#xff08;Structural Patterns&#xff09;&#xff1a;三.行为型模式&#xff08;Behavioral Patterns&#xff09;&#xff1a;四.并发…

【RabbitMQ(day1)】RabbitMQ的概述和安装

入门RabbitMQ 一、RabbitMQ的概述二、RabbitMQ的安装三、RabbitMQ管理命令行四、RabbitMQ的GUI界面 一、RabbitMQ的概述 MQ&#xff08;Message Queue&#xff09;翻译为消息队列&#xff0c;通过典型的【生产者】和【消费者】模型&#xff0c;生产者不断向消息队列中生产消息&…

macOS Ventura 13.5 (22G74) Boot ISO 原版可引导镜像下载

macOS Ventura 13.5 (22G74) Boot ISO 原版可引导镜像下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持在 Windows 和 Lin…

css终极方案PostCSS

一见如故 原理 所有的css框架都在一样的事&#xff0c;那就是由一个css生成一个新的css&#xff0c;那么postcss就来做了一个抽离&#xff1a; 1、将原有的css解析成抽象语法树 2、中间经过若干个插件 3、重新文本化&#xff0c;形成新的css postcss.config.js module.expor…

MX Linux 23 RC1发布

导读MX Linux的开发者宣布MX Linux 23的第一个候选版本已经发布。 MX Linux 是基于 Debian 稳定分支的面向桌面的 Linux 发行&#xff0c;它是 antiX 及早先的 MEPIS Linux 社区合作的产物。它采用 Xfce 作为默认桌面环境&#xff0c;是一份中量级操作系统&#xff0c;并被设计…

技术速览|Meta Llama 2 下一代开源大型语言模型

AI 使用大型语言模型&#xff08;LLM&#xff09;来理解和生成自然语言。LLM 可以从大量文本中学习并创建有关各种主题的文本&#xff0c;并可以完成比如编写代码、生成歌词、总结文章等任务。但有些 LLM 相关课程成本高昂且封闭&#xff0c;而现有的开放课程数量十分有限。这就…

游戏引擎UE如何革新影视行业?创意云全面支持UE云渲染

虚幻引擎UE&#xff08;Unreal Engine&#xff09;作为一款“殿堂级”的游戏引擎&#xff0c;占据了全球80%的商用游戏引擎市场&#xff0c;但如果仅仅将其当做游戏开发的工具&#xff0c;显然是低估了它的能力。比如迪士尼出品的电视剧《曼达洛人》、电影《狮子王》等等都使用…

Server - 调用 K8S 集群 GPU 环境运行算法脚本

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131899662 Kubeflow 是基于 Kubernetes 的机器学习工具包&#xff0c;提供了一套技术栈&#xff0c;包含了很多组件&#xff0c;用于支持…

魔功心法-枚举篇

什么是枚举 枚&#xff1a;量词。一般用于较小的片状物&#xff0c;相当于“个”。 举&#xff1a;提出&#xff1a;列举。举一反三。举个例子。 所以&#xff0c;枚举就是一个个列举出来 枚举的作用 魔功的作用&#xff0c;就不过多描述了&#xff0c;主打的就是一个优雅。…

将AWS S3大文件文件上传相关的API集成为js文件,功能包括 多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示

地址 https://github.com/gk-1213/easy-s3/tree/main easy-s3 将AWS S3大文件文件上传相关的API集成为js文件&#xff0c;功能包括多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示。 暂时不包括文件分片下载相关功能&#…

网工实操基础学习23.07.05

1.交换机&#xff0c;路由器 交换机的作用是链接同一个网络下的所有设备&#xff0c;如果有无线设备加入&#xff0c;需要添加AP&#xff08;无线接入点&#xff09;设备在交换机层次上 路由器的作用是将不同网络下的设备链接 2.IP地址 划分网段&#xff1a;网络位、网段、…

C++第三方开发库matplotlib-cpp

Matplotlib-cpp是一个用于在C中绘制图表的开源库。它提供了与Python的Matplotlib库类似的功能&#xff0c;使得在C环境下进行数据可视化变得更加便捷。基于Matplotlib-cpp&#xff0c;我们可以使用各种绘图函数和样式选项来创建各种类型的图表&#xff0c;包括折线图、散点图、…

单片机第一季:零基础11——实时时钟DS1302

目录 1&#xff0c;DS1302 时钟芯片介绍 2&#xff0c;BCD码介绍 3&#xff0c;涉及到的寄存器 3.1&#xff0c;控制寄存器 3.2&#xff0c;日历/时钟寄存器 3.3&#xff0c;DS1302 的读写时序 4&#xff0c;相关代码 这一章我们来学习DS1302 时钟芯片&#xff0c…