如何在int数组中查找用户定义元素的数量

How to find the number of user-defined elements in an int array?

本文关键字:元素 定义 用户 查找 int 数组      更新时间:2023-10-16

我必须找到int数组中元素的确切数量,这些元素将在声明期间实现。我知道值''等于0,即('' == 0) = true

#include<iostream.h>
int getsize(int arr[])
{
int i = 0,p=1;// initialized to 1 as, if left un-initialised it suffers from undefined behaviour
while(p!=NULL)
{
i++;p=arrr[i]'
}
return i;
}

当代码在主代码中被调用为:时,它工作得很好

void main()
{
int testarr[10]={0,5};
cout<<"nThe size is : "<<getsize(testarr);
}

但当testarr[]修改为int testarr[10]={5,0}

输出变为

The size is : 1

问题是,我很遗憾地被限制为只能读取int0''的早期turbo c++编译器读取CCD_9。我使用了NULL,但是代码似乎不起作用。我有什么东西不见了吗?

如何在int数组中查找用户定义元素的数量?

无法区分程序员指定的零和编译器生成的零。

问题是,我很遗憾地被限制为只能读取int 0和'\0'的早期turbo c++编译器。

这种行为并不特定于您的古代编译器。所有C++编译器都是如此。0的值与''完全相同。但是,您的程序中没有涉及''


while(p!=NULL)

不要将整数与NULL进行比较。这会让任何阅读您代码的人感到困惑(由于C++11可能格式不正确,这取决于标准库选择如何定义NULL)。由于它相当于与零进行比较,因此只需使用while(p)即可。


函数的作用是计算数组中非零元素的数量,直到达到零,但第一个值被忽略并始终计为1。如果数组没有以零结束(在第一个位置以外的其他位置),则该数组被越界访问,并且将存在UB。

从本质上讲,它的工作方式与strlen类似,但对于整数,第一个元素的处理方式不同。

因此,预期输出为:

{0,0,1,2} -> 1
{0,1,0,0} -> 2
{1,0,0,0} -> 1
{0,0,0,0} -> 1
{0,1,2,0} -> 2
{0,1,2,3} -> Any or no output is expected, because UB

我不能检查空指针吗

否。您的数组不包含指针。它包含整数。

testrarr[10]={5,0},默认情况下,在初始化期间,它将数组中的所有值填充为,也就是一个空字符,而不是空指针–

否。数组包含整数,因此不使用null字符填充。零初始化用零整数填充数组(具有相同的null字符值,因此区别很微妙)。

C稍微误用了术语"数组"。数组是数据的组织,缓冲区是放置数据的地方。所以当我们在C 中声明缓冲区时

int testarr[10];

我们声明的缓冲区可以容纳十个整数,而不是十个整数的数组。事实上,这些值可能是"非法整数"陷阱表示。

当你做

int testarr[10] = {0,5};

您有一个由十个整数组成的缓冲区,而数组只有两个。但是,部分原因是数组/缓冲区的混淆根深蒂固,C不会告诉你。通常需要保留一个单独的值,N.

int testarr[10] = {0, 5};
int N = 2;

现在,当我们将数组传递给子例程时,我们传递地址加上N.

int sum(int *x, int N)
{
int answer = 0;
int i = 0;
for(i=0;i<N;i++)
answer += x[i];
return answer;
}
int testarr[10] = {0, 5}:
int N = 2;
total = sum(testarr, N);

请注意,我们还可以对数组切片或动态分配的数组调用sum。函数完全不知道数据之后有任何未使用的整数槽,或者如果数据是静态的,在堆栈上或堆上。