如何查找数组中元素数为零的元素数

我已经声明了一个包含30个元素的数组: –

unsigned char some_array[30]; 

我在数组中存储了一些元素,例如: –

 {0xFB, 0x07, 0x0B, 0x02, 0x00, 0x0C, 0x03, 0x08, 0x0F, 0x0F, 0x07, 0x0A, 0x09, 0x06, 0x0D} 

我需要找到这个数组中的元素数量。

 sizeof (some_array) / sizeof (some_array[0]); 

yield 30,这是数组可以存储的元素总数。

 strlen(some_array); 

yield 4,这是数组中0x00元素的索引。

我怎样才能确定数组中存储的元素数量?

数组中的元素数量为30。

如果您想知道您为其指定值的元素数量,则必须明确跟踪。 没有办法区分具有某个赋值的数组元素和未初始化的元素,其(垃圾)值恰好是相同的值。

如果将元素定义为“除0x00之外的任何内容”,则for循环将执行此操作。

 int len = sizeof (some_array) / sizeof (some_array[0]); int count = 0; for(int i = 0 ; i < len; i++) { if (some_array[i] != 0x00) count++; } /* count is now the number of non 0 elements */ 

根据你的评论看起来你有一个30元素arrays,但只填充前15个,并希望15作为“答案”。 数组仍然有30个元素,没有办法(我知道)从数组中确定你只将15个值放入其中。

像这样定义宏:

 #define INITIALIZE_LIST {0xFB, 0x07, 0x0B, 0x02, 0x00, 0x0C, 0x03, 0x08, 0x0F, 0x0F, 0x07, 0x0A, 0x09, 0x06, 0x0D} #define INITIALIZE_LIST_SIZE sizeof((unsigned char[])INITIALIZE_LIST) 

要使用的示例代码:

 #include  #define INITIALIZE_LIST {0xFB, 0x07, 0x0B, 0x02, 0x00, 0x0C, 0x03, 0x08, 0x0F, 0x0F, 0x07, 0x0A, 0x09, 0x06, 0x0D} #define INITIALIZE_LIST_SIZE sizeof((unsigned char[])INITIALIZE_LIST) int main(void){ unsigned char some_array[30] = INITIALIZE_LIST; size_t size = INITIALIZE_LIST_SIZE; printf("Number of initialize list is %zu\n", size); for(size_t i = 0; i < size; ++i) printf("%02X ", some_array[i]); return 0; } 

没有内置的C构造来完成你的要求。

如你所说,C可以告诉你你已经分配了多大的数组。 但是,它没有在数组中存储有意义值的概念。 当你声明数组时,它有30个(可能是垃圾值)元素,当你在其中放入一些自己的值时,它仍然有30个元素,其中一些是你的值,其中一些是垃圾。

strlen()作用于字符串 ,C中的一种特殊类型的char数组,它存储一个空字节来标记字符串的结尾。

在C中,构建函数中没有查找存储在数组中的元素数,因为数组中所有未填充的字段都有一些值。 它只能找到数组的总大小。

一种方法是在将值加载到数组(不包含特殊字符)之前,使用预定义的特殊字符填充整个数组。 例如;

 unsigned char some_array[30]; memcpy(some_array, '\0', 30); Then load some values to array; strlen(some_array); 

strlen(some_array); 将返回数组中的字符数

在分配实际值之前,您可以对整个数组执行memset ,这将设置一个值,您确定它不会是初始化值范围的一部分,例如0xff。 然后做一个for循环并计数。

 int cnt = 0; memset (some_array, 0xff, 30); for (i = 0; i < 30; i++) { if (some_array[i] != 0xff) { cnt++; } } printf ("%d\n", cnt);