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

时间:2016-04-28 04:53:42

标签: c arrays

我已将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]); 

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

strlen(some_array);

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

如何确定存储在数组中的元素数量?

6 个答案:

答案 0 :(得分:2)

如果将元素定义为“除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元素阵列,但只填充前15个,并希望15作为“答案”。数组仍然有30个元素,没有办法(我知道)从数组中确定你只将15个值放入其中。

答案 1 :(得分:2)

数组中的元素数量为30。

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

像这样定义宏:

#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 <stdio.h>

#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;
}

答案 4 :(得分:1)

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

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

unsigned char some_array[30];

memcpy(some_array, '\0', 30);

Then load some values to array;

strlen(some_array);

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

答案 5 :(得分:0)

在分配实际值之前,您可以在整个数组上执行var json = [{"Google":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, {"Linkedin":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, {"Uber":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, {"Akamai":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, {"Apple":[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]}, {"Hulu":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, {"IBM":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, {"Spotify":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}, {"Amazon":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]; json.forEach(function(n){ Object.keys(n).forEach(function(x) { document.writeln(x + ' is ' + n[x] + '</br>'); }) }) ;,这将设置一个您确定不会成为初始化值范围的值,例如0xff。然后进行memset循环计数。

for