Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在一个元素为零的数组中查找元素数_C_Arrays - Fatal编程技术网

C 如何在一个元素为零的数组中查找元素数

C 如何在一个元素为零的数组中查找元素数,c,arrays,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(som

我已将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元素的索引


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

如果将元素定义为除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个值。

数组中的元素数是30


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

没有内置的C构造来执行您的要求

正如您所说,C可以告诉您分配的数组有多大。但是,它不知道何时在数组中存储有意义的值。当您声明数组时,它可能有30个垃圾值元素,当您将自己的一些值放入其中时,它仍然有30个元素,其中一些是您的值,一些是垃圾值


strlen使用C语言中的一种特殊字符数组,它存储一个空字节来标记字符串的结尾。

定义宏如下:

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

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

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

unsigned char some_array[30];

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

Then load some values to array;

strlen(some_array);

这里是strlensome_数组;将返回数组中的字符数

在指定实际值之前,您可以在整个数组上执行memset,该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);

如果有类型arr[N],则有一个N类型的数组。找出数组中存储了多少个元素是什么意思?在上面的例子中,我希望答案是15。您不需要在问题中定义元素,因为一个包含30个无符号字符的数组将始终包含30个无符号字符的元素。此实现将我的计数设为14,而元素的数量实际上是15!!为什么要这样假设呢?因为在我的例子中,当元素为0时,计数不会增加,索引为5的元素我想@KeithThompson是在评论我后来删除的一条评论。这里有很多答案可供选择,但一般的答案是你不能做你想做的事情-数组有30个元素,即使你只在其中放入15个元素-其他元素仍然存在,你无法将它们与你设置的元素区分开来。明白了!!我已经用@Sumit Trehan的答案实现了一个暂时的解决方案。这是对他的问题的唯一答案,他是如何措辞的。我认为他应该使用某种可调整大小的容器,或者在初始化时用大小声明数组。在填充数组时,我使用计数来跟踪元素的数量。谢谢我试过这么做。如果其中一个元素恰好为0,strlen将给出错误的结果。在我的问题中已经提到了!!。您是否在数组中存储非字符值(如整数)?您这样问是为了让我可以执行memcpysome_数组中的'some non character value',30;,然后填充数组并计数到这个非字符值,对吧!!我存储的值在0x00到0xFF之间。是的,正是同一个空字节,即0,给我带来了麻烦。对,但更重要的是C数组没有跟踪您分配了多少元素。你必须自己做。是的,这是一种方法。在我的例子中,任何元素的高半字节总是0。因此,我使用0xff对数组进行memset,然后使用for循环。然而,这成为一种特殊情况下的解决方案,而不是00和ff之间的任何值都可以作为数组元素的情况!!