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

C 获取它在数组中具有值的元素数,c,arrays,C,Arrays,我有一个如下所示的数组 int arr[32]; arr[0] = 5; arr[1] = 10; arr[2] = 15; arr[3] = 20; 此数组可以包含32个元素。 如果我向该数组中添加如下数据 int arr[32]; arr[0] = 5; arr[1] = 10; arr[2] = 15; arr[3] = 20; 如您所见,我将数据添加到元素0,1,2,3,而其他元素仍然没有初始化或为空 现在,如何获取只有数据的元素计数? 在当前示例中,将获得4个元素。您可以通过多

我有一个如下所示的数组

int arr[32];
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
此数组可以包含32个元素。
如果我向该数组中添加如下数据

int arr[32];
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
如您所见,我将数据添加到元素
0,1,2,3
,而其他元素仍然没有初始化或为空

现在,如何获取只有数据的元素计数?


在当前示例中,将获得4个元素。

您可以通过多种方式执行此操作-一种是保留初始化值的计数器:

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
}

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

您可以通过多种方式做到这一点-一种是保留初始化值的计数器:

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
}
如果位集对您很重要的话,您可以使用位集节省一些空间。

这就是我如何严格列出可能分配的元素的方法。这将创建一个一次写入数组

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;
}
int-arr[32];
int赋值顺序[32];
int assignedOrderIndex=0;
int赋值(int索引,值)
{
int i;
如果(索引<0 | |索引>=32)
返回E_失败;
if(assignedOrderIndex==32)
返回E_失败;
对于(i=0;i这就是我如何保持一个可能已分配元素的严格列表。这将创建一个一次写入数组

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;
}
int-arr[32];
int赋值顺序[32];
int assignedOrderIndex=0;
int赋值(int索引,值)
{
int i;
如果(索引<0 | |索引>=32)
返回E_失败;
if(assignedOrderIndex==32)
返回E_失败;
对于(i=0;i
intarr[32]={0};
int c=0;
arr[0]=5;
arr[1]=10;
arr[2]=15;
arr[3]=20;
对于(inti=0;i
intarr[32]={0};
int c=0;
arr[0]=5;
arr[1]=10;
arr[2]=15;
arr[3]=20;

对于(int i=0;i(1)使用已知值(通常为0)初始化数组。然后检查有多少不是您的起始值。(2)保留一个“nUsed”变量并在每次写入时递增。(3)为“used”元素创建一个包含布尔值的并行数组……必须有更多方法……(4)如果您计划按顺序添加元素,则只需保持要填写的“下一个”索引;(5)对于无序的,上面的任何一个,或保留指定索引列表的并行顺序列表(这本身就是一个顺序数组)。(关于(6)请参见@Nemanjabric答案中的注释)(7)您的新值都与模式
n>0&&n%5==0
。使用与此模式不匹配的值初始化数组。如果需要查找使用了多少元素,请根据您的模式测试每个值。(8)列出允许的值。在
arr
中存储允许值的索引。不使用
arr
中未指向
allowed
数组中有效索引或指向
allowed
数组中指定为“无效”的索引的成员。(9)列出允许的值。使用此列表之外的任何值初始化数组。若要计算“已使用”元素,请将每个值与
允许的
列表进行比较。(1)使用已知值(通常为0)初始化数组。然后检查有多少不是起始值。(2)保留一个“已使用”变量,并在每次写入时递增。(3)为“使用过的”元素创建一个包含布尔值的并行数组……必须有更多的方法……(4)如果您计划按顺序添加元素,您所需要的只是保留要填写的“下一个”索引;(5)对于无序,可以使用上述任何一种,或者使用一个并行按顺序列表来保留指定索引的列表(这本身就是一个按顺序数组)。(对于(6)请参阅@Nemanjabric的答案中的注释)(7)您的新值都与模式
n>0&&n%5==0
。使用与此模式不匹配的值初始化数组。如果需要查找使用了多少元素,请根据您的模式测试每个值。(8)列出允许的值。在
arr
中存储允许值的索引。不使用
arr
中未指向
allowed
数组中有效索引或指向
allowed
数组中指定为“无效”的索引的成员。(9)列出允许的值。使用不在此列表中的任何值初始化数组。若要计算“已使用”元素,请将每个值与
允许的
列表进行比较。不幸的是,我正在考虑添加“重载
[]
运算符”“…谢谢你的回答,但问题是,当我编写一个代码来循环打印只包含数据的元素时,
for(I=0;I<我应该在这里写什么;I++)
@LionKing:“一个数据”--不!数组总是包含数据!@AndyStowAway:Nemanja说“从语义上讲,哪些不能是数组的元素”。因此,如果语义上允许-1,请选择一个不允许的值。(+1,例如。)这给了我一个(6)的想法:首先,选择一个随机的“无效”值并用它填充数组。分配值时,检查它是否为
invalidNumber
——如果是,请选择另一个(不在列表中)在分配新编号之前,将所有
invalidNumber
元素更改为新元素。不幸的是,我正在考虑添加“重载
[]
运算符”…感谢您的回答,但问题是,当我将代码循环以打印只有数据的元素时,
for(I=0;I<我应该在这里写什么;I++)
@LionKing:“一个数据”--不!数组总是包含数据!@AndyStowAway:Nemanja说“从语义上讲,它不能是数组的元素”。所以如果-1