无论如何都要做这样的事情?
int key=50;
int loop=5;
int array[10]={...};
int* Ptr=NULL;
qsort(array, 10, sizeof(int), compareints);
while(loop>0){
Ptr=(int*)bsearch(&key,array,10,sizeof(int),compareints);
if(Ptr!=NULL){
printf("found %d", *Ptr);
}else{
printf("did not find %d", *Ptr);
}
key++;
loop--;
}
问题是密钥增加了,但bsearch
仍在搜索数字50.我猜是因为bsearch
中的关键参数是constant pointer
。
我知道如果在搜索之前所有的密钥都存储在数组中,它就可以工作。但是,这不适合我的申请。任何帮助,将不胜感激。
答案 0 :(得分:1)
转录评论 - 并添加演示代码。
您应该能够在循环的任何给定迭代中搜索任何键,因此您需要显示您认为它仍在搜索50的原因...也许您需要显示数组初始化程序中的内容?可能是你的compareints()
功能行为不端?也许你也应该表明这一点?您的“未找到”字样应打印key
而不是*Ptr
。为了理智,两个printf()
格式字符串都应以\n
结尾。
此代码有效 - 并且不会显着改变您问题中显示的逻辑:
#include <stdlib.h>
#include <stdio.h>
static
int compareints(const void *v1, const void *v2)
{
int i1 = *(int *)v1;
int i2 = *(int *)v2;
if (i1 < i2)
return -1;
else if (i1 > i2)
return +1;
else
return 0;
}
int main(void)
{
int key = 50;
int loop = 5;
int array[10] = { 57, 49, 50, 51, 53, 27, 60, 51, 19, 99 };
int *ptr = NULL;
for (int i = 0; i < 10; i++)
printf("%3d", array[i]);
putchar('\n');
qsort(array, 10, sizeof(int), compareints);
for (int i = 0; i < 10; i++)
printf("%3d", array[i]);
putchar('\n');
while (loop > 0)
{
printf("seeking key %d: ", key);
ptr = (int *)bsearch(&key, array, 10, sizeof(int), compareints);
if (ptr != NULL)
printf("found %d\n", *ptr);
else
printf("did not find %d\n", key);
key++;
loop--;
}
return 0;
}
示例输出:
57 49 50 51 53 27 60 51 19 99
19 27 49 50 51 51 53 57 60 99
seeking key 50: found 50
seeking key 51: found 51
seeking key 52: did not find 52
seeking key 53: found 53
seeking key 54: did not find 54