盘点strlen()、sizeof()、length()、size()的区别

2023-05-16

目录

序言

1 总览

2 用法

2.1 sizeof()

2.2 strlen()

3 length()和size()


序言

        项目中经常用到这些用于计算大小的函数(或运算符),网上也有许多关于其间区别的文章介绍,在此按自己的思路整理一下,以便加深印象。

1 总览

        strlen()、sizeof()、length()、size(),以上函数通常用于C/C++获取字符串的长度;但是他们的使用方法、主要针对的对象、是否包含'\0'结束符等等方面也有所不同,同时这些细节的差异决定了他们的使用场景。

本质参数是否包含'\0'作用
sizeof()运算符数组、指针、类型、对象、函数等获取所占总空间的字节数
strlen()C函数字符型指针(char*)获取字符串长度;从头遍历,遇'\0'截止;
length()

成员函数

(CString或String)

仅针对字符串用于获取字符串的长度;
size()

成员函数

数组、容器用于获取数组或容器中的元素个数;

2 用法

2.1 sizeof()

sizeof()是一个单目运算符,而不是函数;主要作用是返回参数对象所占用的内存字节数;其参数对象比较宽泛,因为关注点在内存占用上,也因此会包含'\0'结束符。

编译时计算,因此不能用于计算动态分配空间的大小;当应用于固定长度数组的计算时,返回的是固定分配的内存字节数;

    char carr[] = "1234";
	const char* pch = "1234";
	char carr1[] = {'1','2','3','4'};
    char carr2[10] = { '1','2','3','4' };

    //1 返回值为5,C风格字符串末尾自动添加了一个结束符'\0';
    cout << "sizeof(carr) = " << sizeof(carr) << endl;

    //2 返回值为4,计算的并不是内存字节占用,而是指针变量本身占用的字节数;
    cout << "sizeof(pch) = " << sizeof(pch) << endl;
	
    //3 返回值为4,计算的是数组中元素占用的内存字节数;
	cout << "sizeof(carr1) = " << sizeof(carr1) << endl;

    //4 返回值为10,计算的是数组固定分配的内存字节数;
	cout << "sizeof(carr2) = " << sizeof(carr2) << endl;

    PS: char carr[5] = "1234"; 这种初始化数组的方式,固定数组长度值一定要计算末尾的结束符'\0'。

通过以上代码段可以看出sizeof()计算时的几个注意点:

1 C风格字符串末尾自动添加结束符'\0',sizeof()的计算是包含结束符的;

2 数组名作为sizeof()的参数时不会退化为指针;

3 固定长度的数组无法用sizeof()来计算实际存储元素的个数;

2.2 strlen()

        strlen()是一个函数,在运行时计算,参数必须是字符型指针(char*),数组作为参数时会退化为指针;从字符串第一个地址开始遍历,直到遇到第一个结束符'\0'为止,大小不包含结束符。

    char carr[] = "1234";
	const char* pch = "1234";
	char carr1[] = {'1','2','3','4'};
	char carr2[10] = { '1','2','3','4'};
	char carr3[] = { '1','2','3','4','\0' };

    //1 返回值为4,数组名退化为指针,不包含结束符;
	cout << "strlen(pch) = " << strlen(pch) << endl;

    //2 返回值为4,不包含结束符;
	cout << "strlen(carr) = " << strlen(carr) << endl;

    //3 返回值为8,返回值是没有意义且计算动作是危险的,数组中没有明确结束符,strlen会一直计算直至遇到第一个结束符为止;
	cout << "strlen(carr1) = " << strlen(carr1) << endl;

    //4 返回值为4,固定长度定义数组时,通常系统会将未使用的空间自动填充'\0';(PS:若单个元素赋值初始化的方式,系统不会自动填充)
	cout << "strlen(carr2) = " << strlen(carr2) << endl;

    //5 返回值为4,数组定义中显示填充了结束符'\0';
	cout << "strlen(carr3) = " << strlen(carr3) << endl;

3 length()和size()

         length()和size()都是成员函数,在运行时计算,length()只针对字符串,而size()可以应用于STL的容器中,size()计算的是元素的个数;在string类中,length()/size()方法返回的是字节数,不管是否包含汉字;

    string str = "1234你好";
	char arr[] = "1234你好";
	string str2 = arr;

	//1 返回值为8,返回字节数;
	cout << "str.length() = " << str.length() << endl;

	//2 返回值为8,返回字节数;
	cout << "str.size() = " << str.size() << endl;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

盘点strlen()、sizeof()、length()、size()的区别 的相关文章

随机推荐

  • Android Verified Boot

    Android Verified Boot 验证程序用来保护用户使用软件在设备上运行的完整性 它通常从设备固件的只读部分开始 xff0c 该部分加载代码并仅在密码验证代码是真实的且没有任何已知的安全缺陷之后执行 AVB是经过验证的引导的一种
  • Android快速编译镜像

    make bootimage 编译bootimagemake vendorimage编译 vendorimagemake dtboimagedtbo ninja快速编译系统 xff08 前提是编译部分的Android mk没有改变 xff0
  • nuttx-概述

    早期基于MSP430系列 STM32系列 EFM32系列 AT91SAM9X imx6ul系列做各种物联网产品 xff0c 近几年国芯片慢慢崛起 xff0c 加上ST芯片价格暴涨 xff0c 更是让国产芯片赢得了难得的发展机会 xff0c
  • nuttx-环境搭建

    尽管nuttx主要遵循Posix 和 ANSI 标准 xff0c 但是毕竟向下支持到了STM32F1系列的芯片 xff08 不带MMU xff09 xff0c 所以这个操作系统本质上还是一个微操作系统 下面从helloworld开始 官网
  • nuttx-第一个app demo

    应用开发 xff0c 与ucos freeRTOS等完全不一样 xff0c 看起来更像是linux的方式 xff0c os与app独立开发 xff0c 但是从单片机不具备MMU这一点就能判断出来 xff0c 假的就是假的 xff0c 即便是
  • nuttx-app的编译和执行原理

    首先阅读apps readme md Built In Applications NuttX also supports applications that can be started using a name string In thi
  • 如何远程登录ubuntu图形界面

    Server u need XDM service client u need exceed xwin32 Here is an instruction I found long time ago when I played with it
  • 网络操作系统 第十三章 邮件服务器及其安装与配置

    1 简述电子邮件的工作原理 用户编辑的E mail被转换成一个标准的邮件格式 xff0c 包括各种样式的文件 xff0c 如图像 声音 可执行程序等 邮件的内 容以各种编码方式转换成ASCII码的形式 xff0c 邮件的接收人地址由 用户名
  • nuttx-OS启动前的准备工作

    程序的基本编译过程为 xff1a 预处理 编译成汇编语言 汇编成机器指令 链接成可执行文件 xff0c 链接依赖于链接脚本 xff0c 使用链接脚本来进行更复杂的地址设置 xff0c 包括了代码段 xff0c 数据段 xff0c bss段等
  • linux线程调度方式测试总结

    总结 xff1a 对三种线程调度方式进行测试 1 SCHED OTHER 分时调度策略 xff0c 为默认方式 xff0c 凡是采用本模式的线程 xff0c 线程优先级会强制为0 xff0c 通俗点将 xff0c 工作在本模式下的线程 xf
  • 网络小白入门之路之以太网链路聚合 ---尚文网络奎哥

    随着业务的发展和园区网络规模的不断扩大 xff0c 用户对于网络的带宽 可靠性要求越来越高 传统解决方案通过升级设备方式提高网络带宽 xff0c 同时通过部署冗余链路并辅以STP xff08 Spanning Tree Protocol x
  • libGL error: MESA-LOADER: failed to open swrast libGL error: failed to load driver: swrast X Error o

    在ubuntu22 04 运行代码 出现这个错误 xff0c 显卡驱动正常 xff0c 并且cuda也能调 xff0c 目前还不知道怎么处理 后续 查了很多资料 xff0c 有些说是环境没配好 xff0c 有些说是显卡驱动与内核版本不一致
  • SDN(一) 用OpenWRT将路由器刷成openflow交换机

    1 引言 积跬步以至千里 xff0c 积怠情以至深渊 xff0c 我要做一个踏实的ABCer 没想到还是正式步入了SDN这条康庄大道上 一切还需从初识Mininet WIFI说起 xff0c 以为SDN如仿真层面那般 xff0c 一个模块对
  • 树莓派(二) 树莓派开启VNC远程连接服务

    1 启用树莓派 VNC 服务 在树莓派命令行终端执行如下命令 xff1a sudo raspi span class token operator span config 出现如下界面 xff1a 依次操作 xff1a Interfacin
  • 自己操作SMT贴片过程 BGA QFN封装

    提前准备 xff1a 1 钢网 xff08 如果有bga 尽量选择0 01mm的厚度吧 xff09 2 锡膏 xff08 如果过期了 xff0c 可以找个空板 xff0c 加点锡膏过一次回流焊测一下导通性 xff09 3 固定台 xff08
  • Linux系统Ubuntu终端用命令编辑一文件并保存

    1 首先进入到该文件所在的目录下 xff0c 比如我要找learn test1 file txt这个文件 xff1a ls表示查看该目录下的所有文件 2 查看该文件的内容 xff0c 使用命令cat file txt xff0c 如下可看到
  • 异常与中断

    异常比中断的优先级高 xff0c 中断可以屏蔽 xff0c 但异常是一定要去处理的 1 undefined instruction CPU遇到了不认识的指令 xff0c 则会进入未定义指令异常处理函数 xff0c 因为CPU不认识该指令 x
  • 大学老师告诉我:20年内程序员会被取代,未来不需要程序员...

    今天收到一个同学的邮件 xff0c 他告诉我 xff0c 他们的大学计算机老师告诉他 xff0c 以后机器人可以自动生成代码 xff0c 估计20年 xff0c 程序员就会被取代 所以他现在感觉很苦恼 xff0c 既然会被淘汰 xff0c
  • MySQL 主从复制

    新建主服务器容器实例3307 span class token function docker span run p span class token number 3307 span 3306 name mysql master span
  • 盘点strlen()、sizeof()、length()、size()的区别

    目录 序言 1 总览 2 用法 2 1 sizeof 2 2 strlen 3 length 和size 序言 项目中经常用到这些用于计算大小的函数 或运算符 xff0c 网上也有许多关于其间区别的文章介绍 xff0c 在此按自己的思路整理