易錯:函數方式實現二分查找整形數組

可能實現函數實現二分查找,咱們首先想到的是接下來這種代碼:
數組

//二分查找
#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 ide

????這是怎麼回事呢函數

原來啊,數組在傳參的時候僅僅只是傳參了首地址過去。、,因此纔會致使計算長度的時候出現錯誤。
咱們的解決辦法是,把計算數組長度放在主函數裏面,在主調函數中多增長一個參數,來解決問題。
朋友們咱們必定要記住:形參其實只是實參的一份臨時拷貝,對形參的改變不會改變實參值,只有經過傳址調用創建聯繫才能對值進行更改(簡而言之:使用指針!!!!)指針

咱們將函數改成以下便可:
blog

//二分查找
#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中程序的規範要求!!!!!string

相關文章
相關標籤/搜索