如何计算int类型数组中的元素数,其中0可以是一个元素?

时间:2017-10-21 08:50:41

标签: c arrays count

期望:我想计算int类型数组中可用元素的数量,其中0可以是元素。

关注程序输出:

Total Element :6

预期产出:

Total Element :9

代码:

#include <stdio.h>

int main() {

    int a[50] = { 1, 2, -3, 0, 0, 6, 7, -8, 0 };
    int count = 0;

    int i = 0;
    for (i = 0; i < 50; i++) {
        if (a[i]) {
            count++;
        }
    }
    printf("Total Element :%d ", count);

    return 0;
}

注意:我想计算数组中元素的总数。我不想计算数组的大小。

3 个答案:

答案 0 :(得分:4)

  

我想计算数组中元素的总数

目前,你不能。

在C中,数组知道哪些元素曾被使用过。

如果无法定义哨兵,塞子值,但您知道可以执行以下操作的初始化器:

#include <stddef.h> /* for size_t */
#include <stdio.h>

#define ARRAY_INITIALISER {1, 2, -3, 0, 0, 6, 7, -8, 0}


int main()
{
    int a[50] = ARRAY_INITIALISER;
    size_t count;

    {
      int tmp[] = ARRAY_INITIALISER;

      count = sizeof tmp / sizeof *tmp;
    }

    printf("Total number of elements 'used': %zu\n", count);

    return 0;
}

答案 1 :(得分:1)

如果你想拥有一个50个元素的固定缓冲区,那么&#34; active&#34;数组可以有任何长度,并且没有有效的sentinel元素(例如字符串中的空字符,或者可能是NULL指针或整数数组中的0或-1或INT_MIN您必须从头开始跟踪活动长度 count

int a[50] = {1, 2, -3, 0, 0, 6, 7, -8, 0};
int count = 9;

如果你想动态构建数组,先从ampty数组和零数开始,然后按&#34; push&#34;数组的元素:

int a[50];
int count = 0;

a[count++] = 1;
a[count++] = 2;
a[count++] = -3;
a[count++] = 0;

注意不要溢出底层固定大小的数组。

答案 2 :(得分:1)

使用sentinel值,即选择一个幻数(如0xDEADBEEF)。

并改变你的代码:

#define SENTINEL 0xDEADBEEF

int main() {
    int a[50] = { 1, 2, -3, 0, 0, 6, 7, -8, 0, SENTINEL };
    int count = 0;

    int i = 0;
    for (i = 0; i < 50; i++) {
        if (a[i] == SENTINEL)
            break;
        if (a[i]) {
            count++;
        }
    }

    printf("Total Element :%d ", count);
    return 0;
}

希望有所帮助。