C/C++中字符串数组及strlen()和sizeof()区别

2023-11-02

1. 字符串数组

  标准C语言中没有字符串(string)类型,而只是在C++后添加了字符串string类,但是并不属于基础数据类型,只是类功能很强大,得到广泛应用。所以一般我们平时处理字符串,即字符序列,使用的都是字符串数组。

1.1 字符串数组定义

char nzArr1[6] = {'C','h','i','n','a','\0'};//‘\0’是字符串结束符
char nzArr2[10]= {'C','h','i','n','a'};//数组未初始化的索引位,系统自动补上'\0',即后5位都是'\0'。

  或者:

char nzArr[] = "China"; //字符串常量最后隐含'\0'

  这块需要注意几种赋初值方式的差异:

char nzArr1[ ]    = {'C','h','i','n','a'};
char nzArr2[ ]    = "China"; 
char nzArr3[6]    = {'C','h','i','n','a'};
printf("%d\n",sizeof(nzArr1));  //结果为5
printf("%d\n",sizeof(nzArr2));  //结果为6
printf("%d\n",sizeof(nzArr3));  //结果为6

  sizeof()计算的是类型或者变量的内存大小。
  nzArr1没有指定数组大小,所以计算以初始化值个数为准。由于char类型所占内存为1个字节,所有计算结果为5。注意以数组初始化形式赋初值不会自动补字符串结束符’\0’。
  nzArr2虽然也没有指定内存空间大小,但是以字符串形式赋初值,字符串常量本身就隐含了’\0’在结尾,所以计算结果为6。
  nzArr3指定了数组大小,除去初始化的,未初始化的索引位系统会默认初始化为’\0’。

1.2 字符串数组赋值问题

  我们直接看下面程序:

char nzArr[6];
nzArr = {'1','2'};//错误

  注意字符串数组初始化和正常赋值的区别。字符串数组不可以整体赋值,只能单个位单个位赋值,即:

char nzArr[6];
nzArr[0] = '1';
nzArr[2] = '2';

  同样的道理,哪怕两个字符串数组长度相同,也不可以互相整体赋值,只能通过引用元素单个位单个位赋值,例如:

char c1[6];
char c2[6] = "hello";
c1 = c2; //错误,不能整体赋值

2. strlen()和sizeof()区别

  sizeof()只是计算类型或者变量内存大小的关键字,不是函数,没有所谓的头文件包含,就是C/C++的一个操作符。编译器自动识别,并且在编译阶段就自动计算了sizeof()的值。
  strlen()是系统(string.h/cstring)头文件中定义的,用来计算以’\0’结尾的字符串长度的函数。它并不是计算内存大小,仅计算字符串从开端到’\0’结尾字符的个数(不包含’\0’)。并且只有在程序运行到strlen()函数地方,才运算统计字符串长度的结果。
  例如:

char nzArr[10]="China";
int  nNum     =strlen(str); //结果为5
int  nLenb    =sizeof(str); //结果为10

  也就是说sizeof()只跟你给该字符串数组定义了多大空间有关,而跟字符串是否结束无关。
  所以当输入一行字符串,在不知道字符个数的时候,可以用strlen()函数来计算字符串长度,而sizeof()则不行。例如:

char str[100];
cin.getline(str,100); //获得流中一行输入的前100个字符,不足100到'\0结束'
int nLen = strlen(str);//得到实际字符串长度
int nNum = sizeof(str);//与输入字符串无关,都是字符串内存大小100

个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋。

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

C/C++中字符串数组及strlen()和sizeof()区别 的相关文章

随机推荐

  • springboot启动后,执行某个方法的实现方式

    1 注解 PostConstruct 直接在方式上面加注解 但是会影响服务提供 比如这个方法要执行五分钟 这五分钟之内是无法提供服务的 这个方法是在服务初始化后之前运行 所以 此方法运行不结束 服务就无法初始化 构造函数 Autowired
  • log日志配置简述

    近期进行log升级 简单配置了下几种常用日志 分别是log4j log4j2 logback 简单整理 不全不深 仅备后用 需求 将应用日志以控制台或文件的形式输出 一 log4j 1 引入jar包 下载并引入log4j的jar包 log4
  • 蓝桥杯真题javaB第三题:振兴中华

    第三题 振兴中华 题目描述 小明参加了学校的趣味运动会 其中的一个项目是 跳格子 地上画着一些格子 每个格子里写一个字 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时 先站在左上角的写着 从 字的格子里 可以横向或纵向跳到相邻的格子
  • .net core 在ubuntu系统下保存图片到本地

    这就是一个坑 using MemoryStream ms new MemoryStream imgBts using Image img Image FromStream ms img Save tempPic jpg 原来在 net Fr
  • 12关于FFmpeg的四种时基和时基相关函数的分析及其场景用法

    12关于FFmpeg的四种时基和时基相关函数的分析及其场景用法 前言 AVRational类型 是一个分数 例如 1 25 表示1除以25即1 25 时基 时间的单位 在ffmpeg下被描述成时基 时间戳 某个时刻的时间 1 FFmpeg的
  • vs更换本地git账号

    有人认为vs中用的git账号是哪个无所谓 其实不然 git账号不同 访问的权限就不一样 那么如果想跟换git账号该怎么做呢 win7 控制面板 gt 用户帐户和家庭安全 gt 凭据管理器 编辑普通凭据中的git账号或者直接删除 然后重启vs
  • 响应式布局 与 Bootstrap

    一 响应式布局 1 什么是响应式布局 使用媒体查询针对不同宽度的设备进行布局和样式设置 从而实现适配不同设备的目的 2 响应式布局的容器 响应式需要一个父级做为布局容器 来配合子级元素来实现变化效果 原理就是在不同屏幕下 通过媒体查询来改变
  • configure移植技巧,绝对干货

    一 环境 主机 ubuntu 开发板 arm linux 二 configure分析 build host target介绍 build为主机环境 如ubuntu redhat等等 执行gcc v命令可以查看到Target变量 build
  • 【STM32+cubemx】0015 HAL库开发:内部flash读写

    本节我们来学习stm32内部flash的读写 在某些应用中 我们需要保存少量掉电仍然不丢失的数据 而在电路板上额外增加一块eeprom或者flash又太浪费硬件资源 这时我们就可以把这些数据保存在stm32内部的flash里 1 stm32
  • debian11 安装 postgress 数据库 -- chatGPT

    问 debian 安装 postgress 数据库 gpt 要在Debian上安装PostgreSQL数据库 您可以按照以下步骤进行操作 1 打开终端 您可以通过点击 应用程序 菜单 然后在 系统工具 或 终端 下找到终端应用程序 2 使用
  • 【100天精通Python】Day43:Python网络爬虫开发_爬虫基础(urlib库、Beautiful Soup库、使用代理+实战代码)

    目录 1 urlib 库 2 Beautiful Soup库 3 使用代理 3 1 代理种类 HTTP HTTPS 和 SOCKS5 3 2 使用 urllib 和 requests 库使用代理
  • 推荐一波Git学习资料

    关于Git的用法我们已经写七篇文章 介绍了Git的不少用法 这些足以应付工作中90 的需求了 剩下的10 就需要小伙伴们在工作中自己慢慢总结了 我这里再给小伙伴们推荐一点Git学习资料 为我们的Git系列画上一个句号 书 推荐两本个人觉得很
  • 2018第八届至2022年第十三届蓝桥杯单片机开放与设计省赛客观题及简解整理

    前言 由于本人马上要参加第十四届蓝桥杯单片机设计与开发的省赛了 在对客观题复习两轮后 发现效率是比较低的 因此整理了2018至2022年的省赛客观题 将大概的考点划分三部分 这样可以更加系统的复习其内容 现在把整理的这份内容分享给各位同学
  • 微信小程序的this.setData()方法更新二级属性数据

    在用this setData 更新数据时 如果要更新的数据如下 data person name xiaoming occupation front end engineer 要把person name更新为 xiaogang 我们如果通过
  • ElementUI 之 el-tabs添加自定义按钮

  • oauth2 jwt token 返回accessToken对象中携带用户字段信息

    oauth2 源码中用户信息只返回用户名称 现有需求要求返回userId 只能重写某些方法 server端和client端都要修改 方法一 结果 userId 封装在token中 需要解析access token才能看到 但是经测试发现 使
  • 【Java基础】Scanner中next与nextLine区别

    Scanner概念 scanner可以用来获取用户的输入 八个基本数据类型除字符外都可以输入 另外输入字符串有两种方式next与nextLine 接下来介绍他们的区别 1 next与nextLine的区别 1 1 区别一 String st
  • 上传AppStore 报错 ERRPR ITMS-90700

    小萌在解决乱七八糟的警告的时候 加入了Background Modes 然后就报了上述错误 把这个去掉之后重新打包 然后就顺利上线了
  • win10上python3密码库pycryptodome使用

    环境安装 python 在 Windows下使用密码库时要安装的是pycryptodome模块 pip install pycryptodome python 在 Linux下使用密码库时要安装的是pycrypto模块 pip instal
  • C/C++中字符串数组及strlen()和sizeof()区别

    1 字符串数组 标准C语言中没有字符串 string 类型 而只是在C 后添加了字符串string类 但是并不属于基础数据类型 只是类功能很强大 得到广泛应用 所以一般我们平时处理字符串 即字符序列 使用的都是字符串数组 1 1 字符串数组