【问题标题】:How to find the number of user-defined elements in an int array?如何在 int 数组中查找用户定义元素的数量?
【发布时间】:2017-01-20 04:59:09
【问题描述】:

我必须找到 int 数组中元素的确切数量,留下在声明期间生效的 '\0's。我知道'\0' 的值等于0 .即('\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

问题是史前涡轮 c++ 编译器,不幸的是,我仅限于读取 int 0'\0' 相同。我使用 NULL 代替,但是代码没有似乎工作。我有什么遗漏吗?

【问题讨论】:

  • 什么是用户自定义元素
  • 一般来说,你不能通过检查数组的元素来找到数组的大小。作为一种特殊情况,您可以将字符数组初始化为文字字符串,编译器将为您终止它。你不能用整数数组来做到这一点。
  • 我不能检查空指针
  • @Danh 我的意思是testrarr[10]={5,0},因为默认情况下,在初始化过程中,它会将数组中的所有值填充为\0 a.k.a null character not nullpionter

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


【解决方案1】:

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

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

问题在于史前的 turbo c++ 编译器,不幸的是,我被限制为读取 int 0 和 '\0' 相同。

这种行为并非特定于您的古老编译器。所有 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 也就是空字符而不是空指针——

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      相关资源
      最近更新 更多