获取它在数组中具有值的元素数

时间:2013-11-17 10:52:12

标签: c arrays

我有一个类似下面的数组

int arr[32];

此数组可包含32个元素 如果我在该数组中添加了一些数据,如下所示

arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;

如您所见,我将数据添加到元素0,1,2,3中,其他元素仍未初始化或为空。

现在,如何获取仅包含数据的元素?

当前示例中的

将获得4个元素。

3 个答案:

答案 0 :(得分:3)

你可以用多种方式做到这一点 - 一个是保持初始值的计数器:

arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
n = 4;

仅当您按顺序填充数组时才有效。

其他方法是使用某些值初始化数组,该值在语义上不能是数组的元素:

int arr[32] = {-1};

之后,您可以检查当前元素是否包含不同于-1的值。

样本循环可以像这样实现:

for(i = 0; i < 32 && arr[i] != -1; i++)
{
   // do things
}

另外,正如@Jongware在评论中指出的那样 - 如果你不介意花费额外空间的O(n) - 你可以有额外的标志数组:

int fill[32] = {0};
arr[0] = 5;   fill[0] = 1;
arr[1] = 10;  fill[1] = 1;
arr[2] = 15;  fill[2] = 1;
arr[3] = 20;  fill[3] = 1;

如果这对您很重要,可以使用位集节省一些空间。

答案 1 :(得分:2)

int arr[32]={0};
int c=0;
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
for(int i=0; i<32; i++){
    if(arr[i]){
            c=c+1;
              }
printf("count is %d",c);
}

答案 2 :(得分:0)

这就是我保留可能分配元素的严格列表的方法。这会创建一次写入数组。

int arr[32];

int assignedOrder[32];
int assignedOrderIndex = 0;

int assign (int index, value)
{
   int i;
   if (index < 0 || index >= 32)
     return E_FAIL;
   if (assignedOrderIndex == 32)
     return E_FAIL;
   for (i=0; i<assignedOrderIndex; i++)
     if (assignedOrder[i] == index)
       return E_FAIL;
   arr[index] = value;
   assignedOrder[assignedOrderIndex] = index;
   assignedOrderIndex++;
   return E_SUCCESS;
}

不知怎的,这可能是你应该转向C ++,因为有标准对象正好这个功能。