易错:函数方式实现二分查找整形数组

可能实现函数实现二分查找,我们首先想到的是接下来这种代码:

//二分查找
#include <stdio.h>
#include <string.h>
int cz_sz(int num[],int a)
{
	int left,right,mid;
	left=0;
	right=sizeof(num)/sizeof(num[0])-1;
	mid=(left+right)/2;
	while(left<=right)
	{

	if(num[mid]>a)
	{
		right=mid+1;
	}
	else
		if(num[mid]<a)
		{
			left=mid+1;
		}
		else
			return mid;
	}
	if(left>right)
		return 0;
}


int main()
{
	int left,right,mid;
	int a,t;
	int num[]={1,2,3,4,5,6,7,8,9,10};
	printf ("请输入你要查找的值:");
	scanf ("%d",&a);
	t=cz_sz(num,a);
	if(0==t)
	{
		printf ("没有找到\n");
		
	}
	else
	{
		printf ("找到了,下标为:%d\n",t);
	}
	return 0;

}

然后你会尴尬的发现:
当你输入了数组当中有的数字之后,他居然给我返回一个..........话不多说上图:
M(}I109`J9JVFT0@J1RZD6T.png

????这是怎么回事呢

原来啊,数组在传参的时候仅仅只是传参了首地址过去。、,所以才会导致计算长度的时候出现错误。
我们的解决办法是,把计算数组长度放在主函数里面,在主调函数中多增加一个参数,来解决问题。
朋友们我们一定要记住:形参其实只是实参的一份临时拷贝,对形参的改变不会改变实参值,只有通过传址调用建立联系才能对值进行更改(简而言之:使用指针!!!!)

我们将函数改为如下即可:

//二分查找
#include <stdio.h>
#include <string.h>
int cz_sz(int num[], int a, int b)
{
	int left, right, mid;
	left = 0;
	right = b - 1;
	
	while (left <= right)
	{
		mid = (left + right) / 2;

		if (num[mid] > a)
		{
			right = mid + 1;
		}
		else
			if (num[mid] < a)
			{
				left = mid + 1;
			}
			else
				return mid;
	}
	
		return 0;
}


int main()
{
	int a, t;
	int num[] = { 1,2,3,4,5,6,7,8,9,10 };
	int b = sizeof(num) / sizeof(num[0]);
	printf("请输入你要查找的值:");
	scanf_s("%d", &a);

	t = cz_sz(num,a,b);
	if (0 == t)
	{
		printf("没有找到\n");

	}
	else
	{
		printf("找到了,下标为:%d\n", t);
	}
	

}


现在执行就没有什么问题了,希望读者能够技术分享,有什么问题指出来,哈哈。然后,scanf_s函数是我在VS2019中程序的规范要求!!!!!











猜你喜欢

转载自blog.51cto.com/15144773/2678897