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

strlen和sizeof的初步理解

大家好我是Beilef,一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学,有啥不对的地方请斧正

文章目录

  • 目录

    文章目录

    前言

    想必大家对sizeof肯定很了解,那对strlen又了解多少。其实这个问题应该让不少人困扰。因为我以前也很困扰。甚至感觉他俩差不多,虽然确实有相似之处。

    一、strlen的用法

    1.strlen函数的原理解析

                                只有字符串是以\0结尾的!

     3.strlen的用法

    答案是14 ,当时我也很懵圈后来才知道空格也算字符

     (一)计数器法

    我们只需要告诉小朋友只要看到小鸡🐥就停下来,哈哈,没错,\0就是那个小鸡

     二,递归法

     二,sizeof(来咯来咯,他真的来喽)

    一定不要忘了:最后专业的事交给专业的人,字符串用strlen函数求长度,数组类型用sizeof操作符求长度!

    总结

    如果你看到这里非常感谢,你的三连是对我的鼓励。有啥不对的请斧正,感谢大家的留言。



前言

想必大家对sizeof肯定很了解,那对strlen又了解多少。其实这个问题应该让不少人困扰。因为我以前也很困扰。甚至感觉他俩差不多,虽然确实有相似之处。


提示:以下是本篇文章正文内容,下面案例可供参

一、strlen的用法

strlen是c语言库的一个函数,当然啦其他语言也存在。

【strlen]函数所做的是一个计数的工作,它从被指定的地点一直向后数,一直等遇到\0为止。并且返还这一个空间中\0以前的元素个数,不在乎元素的类型大小,只在于元素的个数是多少位。这期间返还的是无符号整型数


1.strlen函数的原理解析

size_t strlen( const char *string )

strlen函数的返回值是【size_t],这是一个无符号类型的整数(unsigned int)。

也就是说我们用了strlen函数就是为了找一个空间内的元素的位数所以strlen不会耍些花的,一定返还一个数值即为元素位数。


 2、它的函数参数为:(const char* string)我们可以怎么理解:由const修饰的指向string(字符串)首元素地址的字符指针。

看到这,真相也大白了:strlen函数所作用的对象是字符串!原因也很直接,因为函数规定:由某个指定位置向后逐个扫描计数,直到遇到'\0'停止并返回计数。我们回想一下:数组与字符串二者谁是以’\0‘结尾呢? 

 

                            只有字符串是以\0结尾的!


 3.strlen的用法

其实strlen的用法非常方便,我们只需将这一段的字符串名放进去然后让strlen函数自己去计算

然后我们用整形去接受最后的值就可以。

#include<stdio.h>int main()
{int count = 0;char vate[] = "You can do it!";count = strlen(vate);printf("vate的长度是:%d", count);return 0;
}

 大家这里看看这个答案是A11  B12  C13   D14

 

答案是14 ,当时我也很懵圈后来才知道空格也算字符

 我们知道如何使用strlen函数后,接下来知道strlen函数的3种模拟实现方法(计数器法  递归法,指针法。)我们来看看吧(小弟水平有限指针法就不讲了,希望放过)

 

 (一)计数器法

 计数器法是最简单最直观的方法,当然特是最好使用的一个(本人觉得)

#include <stdio.h>
int my_strlen(const char*arr)
{int count = 0;while (*arr++ != '\0'){count++;}return count ;
}int main()
{int count = 0;char arr[10000] ;scanf("%s", arr);count = my_strlen(arr);printf("%d", count );return 0;
}

 为了能更好的理解这个方法我们来举个例子

my_strlen函数中,字符串就像一群在桥下游过的小鸭子,而count变量就像一个在桥上数鸭子的小朋友,每经过一只鸭子,小朋友用指头计一个数。但鸭子总会全部游过去,小朋友该怎么停止计数呢?

我们只需要告诉小朋友只要看到小鸡🐥就停下来,哈哈,没错,\0就是那个小鸡

 字符串在传参的时候,传出的是字符串的首地址。函数接收后依旧是那个地址,它可以提供给函数访问一直到遇见\0为止。

 代码来喽!!

void my_strlen(const char* vate)
{printf("%s\n", vate);
}int main()
{int count = 0;char vate[] = "You can do it!";my_strlen(vate);return 0;
}

 如果改变了首元素那么就会打印空白。为什么呢

在主函数中,vate字符串的空间已经在内存中被开辟,如果按照正常情况:传址——接收——顺序访问,过程应该是很丝滑的。而在 函数中对首元素的修改,让这个字符串指针与后面数据断开了联系,你想让它在修改后再输出原来的数据,这几乎是不可能的。

 就像一群狼群,你把头狼换了后面的狼肯定不服,就会出现重新选择头狼。在这里就是没有结果打印。

2、有了第一点后,我们已经可以保证我们可以访问这个字符串的全体了,那么接下来我们就需要进行一个while循环条件的设定:如果没有访问到字符串中的‘\0‘(*vate++ != '\0'),就一直得逐个向后访问。

3、最后呢,我们需要安排一个变量,用于每一次进入循环后的++;因为能够进入到循环中,则说明这个元素是非\0的。

 二,递归法


递归真的是个很奇妙的的东西,很多人都淹没在递归的用法中。当然哥哥,俺也一样!!


当我还在迷惑中时突然听见耳畔传来一句话,出来混迟早要还的。递归就像一个回旋镖,不管你仍的多远它终究会回来。一来一回就是递归。

 没错又是代码!!

int my_strlen(const char* vate)
{assert(vate != NULL);if (*vate == '\0'){return 0;}else{return 1 +  my_strlen(vate + 1);}
}int main()
{int count = 0;char vate[] = "You can do it!";count = my_strlen(vate);printf("vate的长度是:%d", count);return 0;
}

 代码的输出还是14,这里就不放了

如果指针vate中的元素不等于'\0',那么进入到else语句:将指针往后移动一位。再次进入if语句中判断,如果找到'\0\,那么return 0。

 总结一下O(∩_∩)O

1、主函数将字符串名传入函数,而字符串名则代表的是字符串的首元素地址,故函数使用指针接收。

2、递归的使用一定要满足两个要点,才算是一个“入门级”的递归。(第一:要设置一个“出口”条件。第二:要让递归无限向出口条件靠近。)


 二,sizeof(来咯来咯,他真的来喽)

 老样子来一个用法

sizeof的用法如下:

sizeof是C/C++中的一个操作符,用于返回一个对象或者类型所占的内存字节数

1。sizeof有两种语法形式:
sizeof(type_name):用于获取类型所占的字节数。如sizeof(int)。
sizeof(object)或sizeof object:用于获取对象所占的字节数。如sizeof(var_name)或sizeof var_name。变量名可以不用括号括住,但带括号的用法更普遍

2。sizeof操作符不能用于函数类型、不完全类型或位字段。如sizeof(max)若此时变量max定义为int max(),则不是正确形式

3。 sizeof计算对象的大小时,同种类型的不同对象其sizeof值都是一致的

4.sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。如sizeof(2+3.14)等价于 sizeof(double)。
5.sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用。
6.C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值3。
注意:在使用sizeof时,需要包含头文件stdio.h4。


strlen函数与sizeof操作符有什么区别呢?

其实,strlen函数是专门用来计算字符串元素的数量,而sizeof则是用来计算数据类型的大小,两者或许根本搭不上边,但因为C语言语法的自由度高,各位大佬们创造出了以下语句,便让sizeof操作符也可以计算出元素的数量:

sizeof(arr)/sizeof(arr[0])

但同样的,以上的写法虽然让sizeof操作符有了计算元素长度的能力,但也仅仅只作用于数组类型。

1、数组名有两种情况下代表整个数组元素:sizeof(数组名)、&数组名。只要sizeof取得整个数组元素后,再除以数组的其中一个元素,就可以计算出数组内的元素数量。

2、如果sizeof用于计算字符串长度时,则会发生麻烦,而这个麻烦的引发者也正是'\0'.

#include<stdio.h>
int main()
{int count = 0;char vate[] = "You can do it!";count = sizeof(vate)/sizeof(vate[0]);printf("vate的长度是:%d\n", count);return 0;
}

 这里输出的就是15

因为sizeof计算的是元素类型的大小,它不像strlen函数,只计数'\0'之前的数位。sizeof在拿到字符串名后,就开始计算全部元素的大小,它才不做选择,它全要!

最后除以char类型的大小(1)后,就有了:15这个结果~ 


一定不要忘了:最后专业的事交给专业的人,字符串用strlen函数求长度,数组类型用sizeof操作符求长度!

总结


如果你看到这里非常感谢,你的三连是对我的鼓励。有啥不对的请斧正,感谢大家的留言。

相关文章:

strlen和sizeof的初步理解

大家好我是Beilef&#xff0c;一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学&#xff0c;有啥不对的地方请斧正 文章目录 目录 文章目录 前言 想必大家对sizeof肯定很了解&#xff0c;那对strlen又了解多少。其实这个问题应该让不少人困扰。…...

纯CSS的华为充电动画,它来了

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; Krpano专栏&#xff1a;想学Krpano的&#xff0c;冲 &#x1f514…...

在架构设计中,前后端分离有什么好处?

前后端分离是一种架构设计模式&#xff0c;将前端和后端的开发分别独立进行&#xff0c;它带来了多方面的好处&#xff1a; 1、独立开发和维护&#xff1a; 前后端分离允许前端和后端开发团队独立进行工作。这意味着两个团队可以并行开发&#xff0c;提高了整体的开发效率。前…...

C语言中的结构体和联合体:异同及应用

文章目录 C语言中的结构体和联合体&#xff1a;异同及应用1. 结构体&#xff08;Struct&#xff09;的概述代码示例&#xff1a; 2. 联合体&#xff08;Union&#xff09;的概述代码示例&#xff1a; 3. 结构体与联合体的异同点相同点&#xff1a;不同点&#xff1a;代码说明 结…...

文件夹共享(普通共享和高级共享的区别)防火墙设置(包括了jdk安装和Tomcat)

文章目录 一、共享文件1.1为什么需要配置文件夹共享功能&#xff1f;1.2配置文件共享功能1.3高级共享和普通共享的区别&#xff1a; 二、防火墙设置2.1先要在虚拟机上安装JDK和Tomcat供外部访问。2.2设置防火墙&#xff1a; 一、共享文件 1.1为什么需要配置文件夹共享功能&…...

❀My排序算法学习之冒泡排序❀

目录 冒泡排序(Bubble Sort):) 一、定义 二、算法原理 三、算法分析 时间复杂度 算法稳定性 算法描述 C语言 C++ 算法比较 插入排序 选择排序 快速排序 归并排序 冒泡排序(Bubble Sort):) 一、定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单…...

服务器数据恢复-raid6离线磁盘强制上线后分区打不开的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器上有一组由12块硬盘组建的raid6磁盘阵列&#xff0c;raid6阵列上层有一个lun&#xff0c;映射到WINDOWS系统上使用&#xff0c;WINDOWS系统划分了一个GPT分区。 服务器故障&分析&#xff1a; 服务器在运行过程中突然无法访问。对服务…...

Zookeeper在分布式命名服务中的实践

Java学习面试指南&#xff1a;https://javaxiaobear.cn 命名服务是为系统中的资源提供标识能力。ZooKeeper的命名服务主要是利用ZooKeeper节点的树形分层结构和子节点的顺序维护能力&#xff0c;来为分布式系统中的资源命名。 哪些应用场景需要用到分布式命名服务呢&#xff1…...

说说 Spring Boot 实现接口幂等性有哪几种方案?

一、什么是幂等性 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等…...

Dash中的callback的使用 多input 6

代码说明 import plotly.express as pxmport plotly.express as px用于导入plotly.express模块并给它起一个别名px。这样在后续的代码中&#xff0c;你可以使用px来代替plotly.express&#xff0c;使代码更加简洁。 plotly.express是Plotly的一个子模块&#xff0c;用于快速创…...

平方矩阵()

平方矩阵1 平方矩阵2 曼哈顿距离 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring>using namespace std;const int N 110;int n; int a[N][N];int main() {while(cin >> n, n){for (int i 0; i < n; i )fo…...

git基本命令

1、安装 介绍 安装 配置 2、git基本命令 2.1 基本操作 #1、查看空目录的git状态 $ git status fatal: not a git repository (or any of the parent directories): .git#2、初始化本地仓库&#xff1a;创建一个git的目录管理当前项目的所有文件版本 $ git init Initializ…...

GPU性能实时监测的实用工具

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

概率论中的 50 个具有挑战性的问题 [第 6 部分]:Chuck-a-Luck

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff09;一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…...

windows搭建MySQL主从补充说明

这3种情况是在HA切换时&#xff0c;由于是异步复制&#xff0c;且sync_binlog0&#xff0c;会造成一小部分binlog没接收完导致同步报错。 第一种&#xff1a;在master上删除一条记录&#xff0c;而slave上找不到。 第二种&#xff1a;主键重复。在slave已经有该记录&#xff…...

Python:GUI Tkinter

GUI编程 GUI编程&#xff08;Graphical User Interface Programming&#xff09;指的是用于创建图形用户界面的程序设计。这种界面采用图形方式显示信息&#xff0c;让用户可以通过图形化的方式与程序进行交互&#xff0c;而不是仅仅通过文本命令。GUI编程使得软件更加直观易用…...

制作一个可以离线安装的Visual Studio安装包

须知 前提条件&#xff0c;需要电脑可以正常上网且网速还行&#xff0c;硬盘可以空间容量足够大&#xff0c;怎么判断容量够用&#xff1f;由组件数量的多少来决定。Visual Studio 频道和发布节奏 https://learn.microsoft.com/zh-cn/visualstudio/productinfo/release-rhythm…...

机器学习——决策树(三)

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、案例一 决策树用于是否赖床问题。 采用决策树进行分类&#xff0c;要经过数据采集、特征向量化、模型训练和决策树可视化4个步骤。 赖床数据链接&#xff1a;https://pan…...

模型量化之AWQ和GPTQ

什么是模型量化 模型量化&#xff08;Model Quantization&#xff09;是一种通过减少模型参数表示的位数来降低模型计算和存储开销的技术。一般来说&#xff0c;模型参数在深度学习模型中以浮点数&#xff08;例如32位浮点数&#xff09;的形式存储&#xff0c;而模型量化可以…...

一个简单的 HTTP 请求和响应服务——httpbin

拉取镜像 docker pull kennethreitz/httpbin:latest 查看本地是否存在存在镜像 docker images | grep kennethreitz/httpbin:latest 创建 deployment&#xff0c;指定镜像 apiVersion: apps/v1 kind: Deployment metadata:labels:app: httpbinname: mm-httpbinnamespace: mm-…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...