strlen和sizeof的区别

"本文详细解析了C语言中strlen和sizeof的区别。strlen用于计算字符串长度,遇到''停止,不包含''; sizeof是运算符,计算变量或数据类型占用的字节数,包括''。示例分析了strlen在不同情况下的行为,以及sizeof对字符串常量和字符数组的处理。强调了''在字符串中的重要性。"

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信大多数初步了解C语言的小伙伴们,应该对strlen和sizeof都不陌生,但是在使用时总会出现或多或少的疑问,我将用这一篇博客解决困扰大家许久的问题(仅此一篇你就会了解的透彻),请耐心阅读!!!


在深究strlen和sizeof的区别时,首先我们需要知道这两个函数所执行的功能分别时是什么?

strlen:

strlen=string length,顾名思义,该函数是用来求解字符串的长度的,所以我们也应该探讨一下字符串的概念;我们都知道在编译器中输入printf(”Hello World!”),就会输出”Hello World!”,这就是一个字符串,类似这种由双引号引起来的一串字符称为字符串面值,或者简称字符串。接着我们就需要了解一下“\0"这个转义字符了,记住任何一个字符串的结尾都会隐藏一个“\0",他是字符串的结束标志,所以我们在用strlen函数读取字符串的时候,当我们遇到“\0"时我们就要停止读取,此时“\0"前字符的个数就是字符串的长度,注意:这里的“\0"只是结束标志,仅仅告诉我们strlen函数读取到这里就要停止了,“\0"不算做一个字符!!!

示例1:

注:使用strlen时需要引用<string.h>这个头文件!!!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
	printf("%d\n", strlen("abcdef"));
	return 0;
}

 我们可以把字符串”abcdef“在内存中的存储结构给大家看一下

 字符串””abcdef“后面隐藏了一个”\0",所以不读,故字符串长度为6。

示例2:

众所周知,C语言中没有字符串对应的类型,它不像整型用int存储,浮点型用float或者double来存储,所以我们定义一个字符串时一般有常用的两种方式,示例1中的“abcdef”只是字符串的一种,示例2我将会再介绍一种,即用一个字符数组来存储字符串的每一个字符。第二种定义方式对于strlen的求解又有什么情况呢?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = {'a','b','c','d','e','f'};
	char arr2[] = {'a','b','c','d','e','f','\0'};
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	return 0;
}

arr1数组只是单纯把字符串“abcdef”的每一个字符用数组存储起来,而arr2数组则是多存储了一个“\0",究竟有什么不同呢?我们一起来看运行及如果。

我们可以看到arr1数组的长度为38,arr2数组的长度为6,为什么呢?同样我们需要探讨两个数组在内存中的存储状况。

 arr2数组的存储情况和示例1字符串的存储情况相同,而arr1却不同,所以arr2的长度为6我们就不再赘述,主要研究一下arr1的长度为什么是38。我们都知道字符串的结束标志为”\0",对于arr1数组来说,没有在数组中额外存储”\0",所以编译器在读取时,并不会像我们所期望的那样停止读取,故长度当然不会时6,至于为什么是38,是因为在读取时,编译器读取完arr1时会继续往后读取,直到读取到”\0",arr1在读取完第38个字符后才会遇到”\0";由于每个人的电脑和编译器不同,读取的长度也不一样,所以arr1这种情况一般我们认为它读取的结果为随机值!!!

示例3:

为了说明”\0"的重要性,我们再举一个例子来说明。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
	
	printf("%d\n", strlen("abc\0def"));
	
	return 0;
}

这里的字符串“abc\0def"读取的结果是3想必不用赘述了吧!!!


sizeof: 

相比strlen函数,sizeof就简单多了,sizeof其实就是一个运算符,主要用来计算所占空间字节的大小。在初识C语言(一)中我曾讲过用sizeof求解各个数据类型所占内存空间的大小,想要查阅的同学们可自行查阅了解:初识C语言(一)_徐憨憨!的博客-优快云博客提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言什么是C语言第一个C语言程序数据类型常量,变量字符串+转义字符+注释选择语句循环语句函数数组操作符常见关键字define定义常量和宏指针结构体前言从本章开始,我们将正式进入C语言的学习当中,首先为了对C语言有一个初步的认识,我将会对C语言所有比较重要的内容做一个浅浅的了解。有的同学会疑问我指针,数组等一些还没有开始学这些内容为什么会出现在本章中,.https://blog.youkuaiyun.com/qq_47908816/article/details/123935676?spm=1001.2014.3001.5501所以我在这里只介绍一下用sizeof来计算一般情况,同样拿”abcdef“来举例吧。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof("abcdef"));
	
	return 0;
}

 

 此时的结果是7,比strlen的结果多1,那是因为sizeof计算的是所占字节大小,所以字符串后面隐藏的”\0"也要计算进去,我们可以调试监视一下arr这个数组。 

 我们可以清楚的看见arr[6] = '\0',故sizeof(arr)= 7。


想必到这里大家对strlen函数和sizeof运算符的区别都有了深刻的认识,如果对你有帮助,希望大家关注,点赞,后续会为大家继续带来相关知识,谢谢!!!

<think>好的,我现在需要帮助用户了解如何启动ZooKeeper集群。用户的问题是关于启动方法配置教程的。首先,我要回忆之前提供的引用内容,看看有哪些相关的信息可以引用。引用[1]提到了启动集群的命令是./zk.sh start,停止是./zk.sh stop,查看状态是./zk.sh status。引用[2][3]则涉及集群搭建的步骤安装配置,比如解压安装包、创建目录等。 接下来,我需要整理出一个清晰的步骤指南。首先应该包括前置条件,比如已经安装好ZooKeeper并完成配置。然后分步骤讲解如何启动集群,可能包括启动命令、验证状态以及连接集群的方法。同时,需要确保每个步骤都有对应的引用支持,例如启动命令来自引用[1],配置部分来自引用[3]。 在配置部分,用户可能需要知道zoo.cfg文件的配置内容,比如dataDir的设置、集群服务器的列表。引用[3]提到了创建目录配置myid文件,这部分需要详细说明,确保用户正确配置每个节点的ID服务器地址。 另外,用户可能还会关心如何验证集群是否成功启动,所以需要包括查看状态的命令,如./zk.sh status,并解释输出结果的含义。连接集群的部分可以使用zkCli.sh脚本,如引用[1]所示。 最后,生成相关问题需要考虑用户可能进一步的问题,比如配置参数、常见错误处理、集群监控工具等。这些需要基于已有的引用内容,并预测用户的学习路径。 需要确保回答符合系统级指令,比如使用正确的中文,数学公式的格式(虽然这里可能用不上),以及引用标注。同时,回答结构要清晰,步骤分明,让用户能够逐步跟随操作。</think>### ZooKeeper集群启动方法及配置教程 #### **一、前置条件** 1. 已完成ZooKeeper安装(参考引用[3]解压安装包到`/opt/modules/`目录)。 2. 集群包含至少3台服务器,且已配置好网络互通。 --- #### **二、集群配置步骤** 1. **配置`zoo.cfg`文件** 进入ZooKeeper配置目录,修改`conf/zoo.cfg`文件,添加以下核心参数: ```properties dataDir=/opt/module/zookeeper/data # 数据目录(需手动创建) clientPort=2181 # 客户端连接端口 server.1=kafka-1:2888:3888 # 集群服务器列表 server.2=kafka-2:2888:3888 server.3=kafka-3:2888:3888 ``` - `server.X`中`X`为节点唯一ID,需与`myid`文件对应[^3]。 2. **创建`myid`文件** 在每台服务器的`dataDir`目录下创建`myid`文件,写入对应节点ID(如服务器1写入`1`): ```bash mkdir -p /opt/module/zookeeper/data echo 1 > /opt/module/zookeeper/data/myid # 服务器1的配置 ``` --- #### **三、启动集群** 1. **启动所有节点** 在每台服务器上执行启动命令: ```bash cd /opt/module/zookeeper ./bin/zk.sh start # 启动服务(引用[1]) ``` 2. **验证状态** 检查每台服务器的运行状态: ```bash ./bin/zk.sh status # 输出应为"leader"或"follower"[^1] ``` 3. **连接集群** 使用客户端连接任意节点: ```bash ./bin/zkCli.sh -server kafka-1:2181 # 连接服务器1(引用[1]) ``` --- #### **四、关键配置参数说明** | 参数 | 说明 | |------|------| | `tickTime` | 心跳间隔(默认2000ms) | | `initLimit` | 初始化连接超时时间(单位:tickTime) | | `syncLimit` | 主从同步超时时间 | | `maxClientCnxns` | 单客户端最大连接数 | ---
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值