期望:我想计算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;
}
注意:我想计算数组中元素的总数。我不想计算数组的大小。
答案 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;
}
希望有所帮助。