在搜索数组中不存在的元素时,我很难理解代码的行为。
int index;
。size_t index;
在下面的代码中将变量索引声明为int index;
和size_t;
之间有什么区别。代码
#include <stdio.h>
#define SIZE 5
int main(void)
{
int numbers[SIZE]={1,2,3,4,5};
int search =0; // This variable define the required number i am searching for
int start = 0 ;
int end = SIZE-1 ;
size_t index;
while (start <= end)
{
int middle = (start+end)/2;
if (search == numbers[middle])
{
index = middle;
}
if (search > numbers[middle])
{
start = middle+1 ;
}
else
{
end= middle-1 ;
}
}
printf("The index of the element is %d",index);
return 0;
}
答案 0 :(得分:3)
基本问题是index
未初始化,并且当您找不到要搜索的内容时,它永远不会被分配。由于printf
语句在这种情况下访问未初始化的变量,因此您的代码具有未定义的行为,即可能发生任何事情 - 包括打印各种数字。
我正在寻找的元素索引的结果总是为零,同时将其声明为int index;
那是&#34;只是运气&#34;
我正在寻找的元素索引的结果是随机数,同时将其声明为size_t索引;
这也是&#34;只是运气&#34;
答案 1 :(得分:1)
以下是一些可用于改进代码的操作项:
SIZE
内包含[]
定义。将其声明为此int numbers[]={1,2,3,4,5};
而不是此int numbers[SIZE]={1,2,3,4,5};
。让编译器为你做数学。index
初始化为某个值(即index = 0;
)。这是问题的主要原因,它正在为程序引入未定义的行为。size_t index
的类型更改为int index
计划中声明的每个变量都是int
,并且该程序将index
视为int
。所以它可能是int
以避免混淆。将其设为else if
子句,而不仅仅是if
:
else if (search > numbers[middle])
{
start = middle+1 ;
}
添加另一个案例,以便在数据集中缺少要搜索的值时使程序正常失败。例如,printf("Data not found: %d", search);
算法仍然不是100%并且有一些缺陷但是我会把这个留给你弄清楚。我希望这些信息有所帮助!
最诚挚的问候!
答案 2 :(得分:1)
问题在于,index
的值未初始化。
将变量初始化为0并不能解决您的问题。
因为您使用index
来返回数组元素的位置。
通过初始化index = 0
将为数组中不存在的元素以及数组的第一个元素提供相同的结果。
更好的方法是初始化为size_t index = -1;
因此,数组中不存在的元素的结果将为b -1。
还检查printf语句中使用的访问说明符,对于size_t数据类型。它可以是,
printf("The index of the element is %ld",index);
答案 3 :(得分:0)
您没有为size_t使用正确的说明符,它不是%d。
尝试使用%zd或%ld,它可以正常工作。
此外,在while循环之后添加它,以便当数组中不存在该元素时,它不会显示索引的奇怪值。
if(start>end) {
printf("That number is not present in the array");
return 0;
}
并在条件printf("The index of the element is %d",index);
下移动if (search == numbers[middle])
行。所以你没有得到这个号码,这个数字不存在&#34;即使它存在于阵列中。
有关代码的更正版本,请参阅https://code.hackerearth.com/80043dg?key=7b325b26aec0f5425b76cc3efbdc93cf