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

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

我必须找到 int 数组中元素的确切数量,留下 '[=14=]'s,这些元素在声明期间生效。我知道值 '[=14=]' 等同于 0 .i.e ('[=17=]' == 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

问题是史前 turbo c++ 编译器,不幸的是我仅限于读取 int 0'[=14=]' same.I 使用了 NULL 但是,代码似乎不起作用。有什么我想念的吗?

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

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

The problem is that the pre-historic turbo c++ compiler,which I'm unfortunately restricted to reads int 0 and '[=21=]' the same.

该行为并非特定于您的旧编译器。所有 C++ 编译器都是如此。 0的值与'[=12=]'完全相同。但是,您的程序中没有'[=12=]'


while(p!=NULL)

不要将整数与 NULL 进行比较。这会让任何阅读您代码的人感到困惑(因为 C++11 可能 ill-formed 取决于标准库选择如何定义 NULL)。由于相当于和零比较,所以直接用while(p).


你的函数是做什么的,它计算数组中 non-zero 元素的数量,直到达到零,除了第一个值被忽略并且总是算作 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

can't I check for null pointers

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

testrarr[10]={5,0} as, by default ,during initialization it fills all the values in the array as [=19=] a.k.a null character not nullpionter –

没有。该数组包含整数,因此未填充空字符。零初始化用零整数填充数组(具有相同的空字符值,因此区别很微妙)。

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

中声明一个缓冲区时
int testarr[10];

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

当你这样做时

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);

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