strlen和sizeof的初步理解

news2024/11/19 9:22:38

大家好我是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操作符求长度!

总结


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

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

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

相关文章

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

python 通过opencv及face_recognition识别人脸

效果&#xff1a; 使用Python的cv2库和face_recognition库来进行人脸检测和比对的 0是代表一样 认为是同一人。 代码&#xff1a; pip install opencv-python pip install face_recognition# 导入cv2库&#xff0c;用于图像处理 import cv2 # 导入face_recognition库&#…

【MySQL】数据库之事务

目录 一、什么是事务 二、事务的ACID是什么&#xff1f; 三、有哪些典型的不一致性问题&#xff1f; 第一种&#xff1a;脏读 第二种&#xff1a;不可重复读 第三种&#xff1a;幻读 第四种&#xff1a;丢失更新 四、隔离级别有哪些&#xff1f; &#xff08;1&#xf…

Sublime Text 4 中文汉化教程(Version: Build 4169)

Sublime Text 4汉化 1 知识小课堂1.1 sublim简介1.2 其他编辑器 2 安装过程2.1 安装Install Package Control2.2 Install Package2.3 安装工具包2.4 常用的插件2.5 安装中文包 1 知识小课堂 1.1 sublim简介 Sublime是一款代码编辑器&#xff0c;致力于为开发人员提供快速、高…

IDEA 控制台中文出现乱码问题解决

一、问题概述 请看下图 二、问题分析 IDEA控制台输出乱码一般会有三种来源&#xff1a; ① IDEA本身编码错误 ② Tomcat日志输出编码错误 ③ 项目本身原因。 终极原因&#xff1a;IDEA编码和Tomcat编码不一致&#xff0c;统一设置为UTF-8即可。 三、解决思路 修改…

双向循环链表实现C语言关键字中英翻译机 ฅ( ̳• · • ̳ฅ)

目录 1.双向循环链表的声明与定义&#xff1a; 2. 创建链表并对节点中的数据赋初值 3. 插入节点并链接 4.中英翻译 5. 小游戏的实现 6.菜单的实现 7. 释放内存 8.在主函数中用刚才定义的函数实现各种代码 输入样例&#xff1a; 实现方法&#xff1a;双向循环链表来实…

同城配送小程序解决方案

前言 同城配送小程序解决方案。 一、用户用车 用户打开小程序后发货地址自动定位到用户当前位置&#xff0c;用户可通过地址后的>号在地图上选择新的发货地址和卸货地址&#xff0c;小程序会自动规划出行线路&#xff0c;计算距离和运费价格。 用户仅用简单操作后就可以…

【网络协议】远程登录安全连接协议SSH(Secure Shell)

文章目录 什么是SSH协议&#xff1f;SSH为何是安全的&#xff1f;SSH由哪些组件构成&#xff1f;SSH可以帮助实现的功能SSH的工作原理SSH的历史版本常用的SSH工具有哪些SSH配置案例参考Windows 安装SSHUbuntu系统SSH配置Cisco Switch SSH配置华为Switch SSH配置 客户端启用SSH连…

uni-app 命令行创建

1. 首先创建项目&#xff0c;命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错&#xff0c;如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法&#xff1a; 创建目录 C:\Users\Administrator\AppData\Roaming\n…

cpp_05_类_string类

1 类的定义 1.1 构造函数 定义&#xff1a;函数名必须与类名相同&#xff0c;且没有返回值类型 &#xff0c;连void也没有。 构造函数调用时间&#xff1a; 在定义对象的同时自动被调用&#xff0c;而且仅被调用一次&#xff1a; 1&#xff09;对象定义语句 2&#xff09;n…

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850 2023/12/26 8:22 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab And…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)EventLoop初始化

这个Dispatcher是一个事件分发模型&#xff0c;通过这个模型,就能够检测对应的文件描述符的事件的时候,可以使用epoll/poll/select,前面说过三选一。另外不管是哪一个底层的检测模型,它们都需要使用一个数据块,这个数据块就叫做DispatcherData。除此之外,还有另外一个部分,因为…

idea导入spring-framework异常:error: cannot find symbol

从github上clone代码spring-framework到本地后导入idea&#xff0c;点击gradle构建后控制台提示异常&#xff1a; 具体异常信息&#xff1a; /Users/ZengJun/Desktop/spring-framework/buildSrc/src/main/java/org/springframework/build/KotlinConventions.java:44: error:…

智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.侏儒猫鼬算法4.实验参数设定5.算法结果6.…

【操作系统】探究文件系统奥秘:创建proc文件系统的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;Linux专栏&#xff1a;《探秘Linux | 操作系统解密》⏰诗赋清音&#xff1a;月悬苍穹泛清辉&#xff0c;梦随星河徜徉辉。情牵天际云千层&#xff0c;志立乘风意自飞。 ​ 目录 &a…

编译原理-----逆波兰表示法,四元式,三元式,间接三元式

目录 逆波兰表达式 四元式 三元式 间接三元式 逆波兰表达式 逆波兰表示法即后缀表达式&#xff0c;而后缀表达式需要注意&#xff1a; ①遵循从外向内进行分析 ②由算数优先符从低到高进行拆分&#xff0c;例如&#xff1a; 我们以“-”号作为分隔进行拆分&#xff0c;…

STM32逆变器方案

输入电压&#xff1a; 额定输入电压&#xff1a;DC110V 输入电压范围&#xff1a;DC77-137.5V 额定输出参数 电压&#xff1a;200V5%&#xff08;200VAC~240VAC 可调&#xff09; 频率&#xff1a; 42Hz0.5Hz&#xff08;35-50 可调&#xff09; 额定输出容量&#xff1a;1…

LNPMariadb数据库分离|web服务器集群

LNP&Mariadb数据库分离&#xff5c;web服务器集群 网站架构演变单机版LNMP独立数据库服务器web服务器集群与Session保持 LNP与数据库分离1. 准备一台独立的服务器&#xff0c;安装数据库软件包2. 将之前的LNMP网站中的数据库迁移到新的数据库服务器3. 修改wordpress网站配置…

【SpringBoot篇】解决缓存击穿问题② — 基于逻辑过期方式

&#x1f38a;专栏【SpringBoot】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f38d;什么是逻辑过期方式⭐思路&#x1f339;代码 &am…

Spring实战系列(三)了解容器的基本实现

我们可以通过GitHub或者码云下载spring-framework源码&#xff0c;这边是基于5.X版本进行下载学习的。 地址&#xff1a;https://github.com/spring-projects/spring-framework 分析Spring源码是非常一件的难的事情&#xff0c;只能一步步学习&#xff0c;一步步记录。 前面在…