C语言求数组长度

C语言求数组长度前言 C 语言对于不同的数据类型的数组求长度方式稍微有不同的地方 1 对于字符数组求长度第一种使用 strlen include stdio h include string h intmain chara 10 dmeo printf d strlen a strlen 检索到 0 结束 输出 第二种使用 sizeof 来完成 include stdio h include stdio h string h stdio h

前言

这是早期写的一篇文章,存在大量的错误,这里要做一个道歉,并对错误的内容做一些刊正

首先要说明一下,求数组长度本身是一件不常见的事情,通常我们会根据自己的需求来申请数组的长度,同时系统也会一次性的给我们分配出数组要占据的全部内存

但是某些时刻,我们申请的数组容量并不会被全部使用到,虽然我申请了长度为10的数组,但是我只存储5组的数据情况也时有发生,这个时候也许就有了得到数组真实长度的需求,但是很遗憾的是,大多情况下该问题是无解的,下面就做一些简单的解析

对于char数组使用用strlen()

对于字符数组有专门的函数来处理这种情况,即strlen(),其原理为遍历数组直到\0为止,但是需要注意的是,其仅仅对于直接对于整个数组赋值时有效,如下代码所示,正常情况下可以直接打印出结果:

#include 
     #include 
     int main() { 
    char a[10]="dmeo"; printf("%d",strlen(a)); //strlen()检索到\0结束 } 

但是如果我们通过数组下标来执行一一赋值,就没有办法使用这样的方法了:

void main() { 
    char a[10]; a[0] = 'c'; printf("%d", strlen(a)); } //日志结果:54 

这是因为我们直接为数组传入字符串demo的时候,其实是传入一个demo\0的字符串,并占据了五个数组位置,这里可以简单的验证,定义一个长度为4的字符数组并传入demo这个字符串,系统会提示数组超限,如图:

在这里插入图片描述

由于字符串这样的特殊性,使得我们可以在char数组中,根据\0的位置来判断实际内容的长度

而回到第二种情况时,通过字符下标来传入数据时,并没有方法补充\0,同时这种方式也并不是顺序插入数据,所以没有办法使用strlen()函数来得到结果

那么还有什么办法可以使的吗,这里还是从现象出发,定义知乎数组,并打印一下,并对于未传入数据的部分执行打印:

void main() { 
    char a[2]; a[0] = 'f'; for (int i = 0; i < 2; i++) { 
    printf("%c ", a[i]); } } 输出结果:f ? 

欸,没有插入数据的空间输出的是一个,但是真的是吗,可以加一个判断

void main() { 
    char a[2]; a[0] = 'f'; for (int i = 0; i < 2; i++) { 
    if (a[i] == '?') { 
    printf("%s", "空的空间是?"); } } } //打印日志: 

其实空的空间输出结果并不是,只是由于乱码显示而出现的结果,当然我们可以直接将其转换为int值来与ascii码做对比,得到的结果与对应的并不相同,但是这给了我启发,如果每一个空的空间打印出的ascii数值都一样,就可以用这个ascii来执行判空操作,最后得到数组的真实长度

关于这个ascii数字,本身是系统在变量未初始化时,给定的一个值,其本身可能是随机的,但是可能由于DEBUG的原因,会给一个固定的值

首先通过打印得到空的ascii数值为-52,我也去百度了一下,发现有一些情况会出现-52,稍微可以证明其相对是比较特殊的,有可能是系统补空的默认符号,简单的进行一些测试:

void main() { 
    char a[10]; a[0] = 'f'; a[4] = 'g'; int length = 0; for (int i = 0; i < 10; i++) { 
    if ((int)a[i] != -52) { 
    length++; } } printf("%d", length); } //打印日志:2 

我自己做了一些测试,发现结果都是对的,但是这一些都是根据现象做出的一些推测,并不能做出最后的肯定

对于int数组

如果从相同的角度思考,int数组初始化时直接赋值的结果是什么呢,同样写一段代码测试输出结果:

void main() { 
    int nums[4] = { 
    1,2 }; for (int i = 0; i < 4; i++) { 
    printf("%d ", nums[i]); } } //输出日志:1 2 0 0 

通过输出结果可以看出,直接对于数组初始化,系统会对未定义空间执行默认补充0的操作,而由于补0的这一操作,使得对于数据实际长度的判断收到干扰,以至于基本想不到什么办法可以排除补0的干扰而得到实际的数据长度,同样对于其他数字类型的数组也是如此

这里我也同样测试了int数组的空数据的索引结果,在数据未初始化时候打印出的数值为:-,这个数字刚好是变量未初始化时执行打印对应值(本身是二进制0xCCCCCCCC),这里如果你想的话,也可以通过该数做对比判断

总结

求数组真实长度本身意义不大,也基本没有应用空间,但是通过这一个过程,可以稍微来理解一下数组的结构与实现过程

同时,目前我本人对于C语言的了解也不够深入,如果哪里描述有问题,还希望指出,我会认真理解并做出修改的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211776.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午9:38
下一篇 2026年3月18日 下午9:38


相关推荐

  • 项目开发序言「建议收藏」

    项目开发序言「建议收藏」今天决定换成uni-app来开发。用到的工具:HBuilder +微信开发者工具 + 小程序appid1.功能概述 消费者端:分为首页、商城、我的 首页:banner广告展示、菜品预览 商城:banner广告展示、全部商品、热销商品、公益、非遗 我的:积分和信用分的展示、我的兑换、今日签到、设置 商家端:功能、我的 功能:…

    2022年8月18日
    11
  • 从智能家居的发展看对讲企业的定位

    从智能家居的发展看对讲企业的定位当你在浏览最近的热词榜单时,智能家居会位居其中。自智慧城市建设的大潮来袭之后,智能家居是“首当其冲”,自然是占了个大便宜!同时,楼宇对讲企业也迎来了春天。相信好多人都知道楼宇对讲,它最早是出现在高层住宅、公寓大厦内外,用来传递户内与单元门之间的信息,并控制防盗门,甚至可在紧急情况下住户通过它向安保值班室报警。它是智能家居体系下最重要的一部分。如今面对智…

    2022年6月22日
    28
  • 即梦ai标准模式怎么没有了

    即梦ai标准模式怎么没有了

    2026年3月13日
    2
  • cmos与非门电路、或非门电路

    cmos与非门电路、或非门电路cmos 与非门电路 cmos 与非门简介与非门是与门和非门的结合 先进行与运算 再进行非运算 与非运算输入要求有两个 如果输入都用 0 和 1 表示的话 那么与运算的结果就是这两个数的乘积 如 1 和 1 两端都有信号 则输出为 0 1 和 0 则输出为 1 0 和 0 则输出为 1 与非门的结果就是对两个输入信号先进行与运算 再对此与运算结果进行非运算的结果 简单说 与非与非 就是先与后非 电工学里一种基本逻辑电路 是

    2026年3月19日
    2
  • iOS二维码扫描

    iOS二维码扫描导入AVFoundation库,并将它加入.pch预编译文件给相机预览控制器DTCameraPreviewController添加四个私有成员,获取AVFoundation的“终端”、“输入”、“输出”、“管理员”对象:@implementationDTCameraPreviewController{AVCaptureDevice*_camera;AVCaptureDevice

    2022年6月24日
    26
  • 1维卷积神经网络_卷积神经网络 一维信号处理

    1维卷积神经网络_卷积神经网络 一维信号处理 维卷积神经网络,可以用来做一维的数据分析,以家用电器的识别分类作为背景。使用excel画出的简单的图形如下,横坐标为用电器开启后的秒数,纵坐标为某一秒的有功功率,由上至下分别为空调(AirConditioner),冰箱(Refrigerator),烤炉(Stove):! 从上面三个图可以看出不同的用电器在工作时会以自己特有的方式工作。从而形成不同的特征峰及平台。接下来使用到的数据一共…

    2025年12月6日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号