如何查找 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);
请注意,我们还可以对数组切片或动态分配的数组调用求和。该函数完全不知道数据之后是否有任何未使用的整数槽,或者数据是静态的、在堆栈上还是在堆上。
我必须找到 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);
请注意,我们还可以对数组切片或动态分配的数组调用求和。该函数完全不知道数据之后是否有任何未使用的整数槽,或者数据是静态的、在堆栈上还是在堆上。