You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于从文件初始化数组(含复杂嵌套结构)时的有效元素统计与剩余元素置零的技术问题

关于从文件初始化数组(含复杂嵌套结构)时的有效元素统计与剩余元素置零的技术问题

嘿,我来唠唠这段时间折腾数组初始化的经历,踩了坑也捡了宝,分享给遇到类似情况的朋友~

背景:想偷懒的初始化方式

我本来不想写那些麻烦的文件解析代码(比如fopen()fread()那一套),想直接让编译器帮我搞定数组初始化——把输入内容存在in.txt里,然后这么写代码:

#define MAX_ELEMENTS (20)
int a [ MAX_ELEMENTS ] = #include "in.txt";

但刚这么写就遇到两个核心问题:

  • 怎么准确统计从文件里实际读入了多少个元素?
  • 怎么让编译器把数组中没被文件初始化的剩余位置自动置0?

我的失败尝试:靠猜元素个数的笨办法

一开始我想了俩歪招,但都有致命缺陷:

  • 从左到右数非零元素:如果文件里的元素本身就有0(比如中间某个值是0),直接就数错了
  • 从右往左跳零找非零:要是文件最后几个元素就是0,或者编译器自动初始化的不是0(当时没吃透C标准,心里没底),这方法直接报废
  • 最糟的假设:如果编译器自动初始化的剩余元素不是0,那我这俩思路全白搭

输了?也赢了?

结果是我既“输了”又“赢了”:

为啥说“输了”

  1. 我的实际输入文件根本不是简单的一维数组,而是嵌套的复杂结构,比如:
{  {{1     },{100    },73},  {{1,5   },{  3,2  },14},  {{1,5,10},{ 10,2,1},23}}

之前的那些思路根本没法直接套用
2. 一开始的笨思路其实改改小bug也能用,但那是歪打正着,根本不是正确的解决办法

为啥说“赢了”

因为我学到了一个惊艳到爆的技巧!就是用sizeof的编译期计算来直接拿到文件里的元素总数:

sizeof ((int[]){   #include "in.txt"}) / sizeof (int)

虽然这行代码看起来有点“丑陋”,读起来费劲,但它完美解决了元素计数的问题——直接让编译器在编译阶段帮我们计算从文件中读入的元素总数,完全不用靠遍历猜值,简直是黑魔法!

另外关于剩余元素置零的问题,后来我才吃透C标准:如果数组在初始化时只提供了部分元素,那么未被初始化的剩余元素会被编译器自动置为0(不管是全局/静态数组,还是用=初始化的局部数组),这个问题其实根本不用额外操心,编译器会自动处理!

最后吐槽

现在最头疼的是选哪个答案当最佳——虽然@AlphinThomas是第一个回答的,但@Lundin的这个sizeof技巧太戳我了,真的很难抉择!

火山引擎 最新活动