2016-04-28 42 views
-1

我宣布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元素的索引。

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

+0

如果你有'type arr [N]'你有一个'N''类型的数组。你是什​​么意思找出有多少元素存储在数组中? – CoffeeandCode

+0

在上面的例子中,我期待的答案是15. – Abhishek

+0

你需要在你的问题中定义“不是一个元素”,因为30个'unsigned char'的数组总是有30个元素('unsigned char's) 。 – CoffeeandCode

回答

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

这个实现会让我数到14,而元素的数量实际上是15! – Abhishek

+0

你为什么做这个假设? –

+0

因为计数不会在元素为0时递增(在我的情况下,索引为5的元素) – Abhishek

2

数组中元素的个数为30

如果你想知道的元素数到您指定的值,你就必须跟踪明确。没有办法区分具有某个指定值的数组元素和(垃圾)值碰巧是相同值的未初始​​化元素。

+0

这是他对问题的唯一答案。我认为他应该使用某种可调整大小的容器,或者在初始化时用大小来声明数组。 – CoffeeandCode

+0

是的,这对我有用。我用计数来记录元素数量,同时填充我的数组。谢谢!! – Abhishek

2

没有内置的C构造来完成你所要求的。如你所说,C可以告诉你你有多大的分配数组。但是,它没有关于何时在数组中存储有意义的值的概念。当你声明数组的时候,它有30个(可能是垃圾值)元素,当你把一些你自己的值放进去时,它仍然有30个元素,其中一些是你的值,其中一些是垃圾。

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

+0

是的,它是相同的“NULL”字节,即0给我带来麻烦。 – Abhishek

+1

没错,但更重要的一点是C数组不会跟踪您分配了多少元素。你必须自己做这个。 – skearney

+0

就是这样! – Abhishek

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

在C没有在建函数来查找存储在数组中的元素数目,因为所有未填充的字段在数组中会有一定的价值。它只能够找到数组的总大小。

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

unsigned char some_array[30]; 

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

Then load some values to array; 

strlen(some_array); 

这里strlen(some_array);将在阵列

+0

尝试这样做。如果其中一个元素碰巧是0,strlen会给出错误的结果(已经在我的问题中提到过了!!)。 – Abhishek

+0

你在数组中存储非字符值(如整数)吗? –

+0

你问我这样做,我可以做“memcpy(some_array,'一些非字符值',30);”,然后填充数组并计数到这个非字符值!那么,我存储的值在0x00到0xFF之间。 – Abhishek

0

返回的字符数指定的实际值之前,你可以将它设置一个值,你肯定不会成为其中的一部分,整个阵列上做了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); 
+0

是的,这是一种方法。在我的情况下,任何元素的高半字节总是0.所以我用0xff“memset”数组,然后使用for循环。但是,这成为特殊情况的解决方案,而不是在00和ff之间的任何值可以是数组元素的情况下! – Abhishek

相关问题