我必须找到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
相反,但代码似乎不起作用。有什么我想念的吗?
答案 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。该函数完全不知道数据之后的任何未使用的整数槽,或者数据是静态的,堆栈上还是堆上的。