当前位置: 首页 > 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-…...

手把手教你用QQbot对接多青龙面板(含CK分配技巧)

手把手教你用QQbot对接多青龙面板&#xff08;含CK分配技巧&#xff09; 在自动化管理工具日益普及的今天&#xff0c;如何高效管理多个青龙面板成为许多开发者的痛点。本文将带你从零开始&#xff0c;通过QQbot实现多青龙面板的智能对接&#xff0c;并深入探讨Cookie&#xff…...

揭秘100.64.0.0/10:运营商级NAT如何重塑IPv4网络格局

1. 100.64.0.0/10&#xff1a;这个神秘IP段到底是什么&#xff1f; 第一次在路由器后台看到100.64.0.1这个IP时&#xff0c;我整个人都懵了——这既不是常见的192.168局域网地址&#xff0c;也不是公网IP。就像发现自家门牌号突然变成了酒店房间号&#xff0c;这种违和感促使我…...

iMeta | 浙江农科院卢立志/曾涛联合中南大学湘雅医院揭示人参皂苷Rg3缓解肝脏铁死亡的新机制

点击蓝字 关注我们一种生物活性人参皂苷改善非酒精性脂肪性肝炎中氧化磷脂积累引起的肝细胞铁死亡iMeta主页&#xff1a;http://www.imeta.science研究论文● 原文: iMeta(IF 33.2, 中科院双一区Top)● 英文题目: A bioactive ginsenoside alleviates hepatocellular ferroptos…...

Phi-4-mini-reasoning保姆级教学:Windows WSL2环境部署全流程

Phi-4-mini-reasoning保姆级教学&#xff1a;Windows WSL2环境部署全流程 1. 模型介绍 Phi-4-mini-reasoning是微软推出的3.8B参数轻量级开源模型&#xff0c;专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这个模型主打"小参数、强推理、长上下文、低延迟"的…...

从电影字幕到新闻分析:手把手教你构建专属领域语料库

从电影字幕到新闻分析&#xff1a;手把手教你构建专属领域语料库 当我们需要分析某个特定领域的文本时&#xff0c;通用语料库往往难以满足需求。比如你想研究电影对白中的情感表达模式&#xff0c;或者分析地方新闻中的事件关联性&#xff0c;这时候就需要构建自己的专属语料库…...

m4s-converter:让B站缓存重获新生的轻量级格式转换工具

m4s-converter&#xff1a;让B站缓存重获新生的轻量级格式转换工具 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你辛苦缓存的B站视频因下架…...

实测Claude 4.5 Opus重构“屎山”代码:手把手教你用AI给遗留项目做外科手术(附前后对比与单元测试生成)

实测Claude 4.5 Opus重构“屎山”代码&#xff1a;手把手教你用AI给遗留项目做外科手术&#xff08;附前后对比与单元测试生成&#xff09; 接手一个满是"祖传代码"的老旧项目&#xff0c;就像被丢进一座迷宫——变量命名像密码&#xff0c;函数逻辑像意大利面&…...

Qwen3.5-35B-A3B-AWQ-4bit图文理解入门:支持中文的图片问答新手必学5个技巧

Qwen3.5-35B-A3B-AWQ-4bit图文理解入门&#xff1a;支持中文的图片问答新手必学5个技巧 1. 认识Qwen3.5图文理解模型 Qwen3.5-35B-A3B-AWQ-4bit是一款专为视觉多模态理解设计的量化模型&#xff0c;它能像人类一样"看懂"图片内容并进行智能对话。这个模型特别适合需…...

大海捞针:从海量真实世界5G-A基站数据中追踪无人机

大家读完觉得有帮助记得关注和 点赞&#xff01;&#xff01;&#xff01; 摘要 无人机在日常生活中的潜在应用使得对其监控变得至关重要。然而&#xff0c;现有的无人机监控系统通常依赖于摄像头、激光雷达或雷达&#xff0c;这些系统的感知范围有限或部署成本高昂&#xff0…...

Intv_AI_MK11 Anaconda数据科学环境配置:一站式AI研发平台搭建

Intv_AI_MK11 Anaconda数据科学环境配置&#xff1a;一站式AI研发平台搭建 1. 为什么选择Anaconda搭建AI开发环境 如果你刚开始接触AI开发&#xff0c;可能会被各种环境配置问题困扰。不同框架的版本兼容性、CUDA驱动安装、Python包依赖冲突...这些问题足以让新手望而却步。A…...