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

时间:2017-01-20 04:59:10

标签: c++ arrays c++03 turbo-c++

我必须找到int数组中保留'\0' s的元素的确切数量,这些元素在声明期间实现。我知道值'\0'相当于0 .i.e ('\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;
}

代码在main中调用时工作正常:

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'\0'。我使用了NULL相反,但代码似乎不起作用。有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

  

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

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

  

问题在于史前的turbo c ++编译器,我不幸地将其限制为读取int 0和&#39; \ 0&#39;同样的。

这种行为并非特定于您的古代编译器。所有C ++编译器都是如此。值0与'\0'完全相同。但是,您的计划中没有'\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}默认情况下,在初始化期间,它将数组中的所有值填充为\0 a.k.a null字符而不是nullpionter -

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

答案 1 :(得分:1)

C滥用术语&#34;数组&#34;略。数组是数据组织,缓冲区是放置数据的地方。所以当我们在C

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

我们声明一个缓冲区,它可以容纳十个整数,而不是一个十个整数的数组。实际上,这些值可能是&#34;非法整数&#34;陷阱表示。

当你这样做时

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。该函数完全不知道数据之后的任何未使用的整数槽,或者数据是静态的,堆栈上还是堆上的。