c - bsearch 在循环中更改键

标签 c sorting search bsearch

有没有办法做这样的事情?

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--;
}

问题是 key 增加了,但是 bsearch 仍然搜索数字 50。我猜是因为 bsearch 中的 key 参数是一个常量指针。 我知道如果所有键在搜索之前都存储在一个数组中,它就可以工作。但是,这不适合我的应用程序。任何帮助,将不胜感激。

最佳答案

转录评论 — 并添加演示代码。

您应该能够在循环的任何给定迭代中搜索任何键,因此您需要说明为什么您认为它仍在搜索 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

关于c - bsearch 在循环中更改键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18699142/

相关文章:

c - DTS 和 PTS 不同,尽管没有 B 帧 (ffmpeg)

c - 从循环中删除 if 语句

sorting - Grails 2.3.4 排序/FindAll 更改

sorting - 按指定字段对结构 slice 进行排序

c - 如何在国际象棋 AI 中正确检查 caSTLing?

c - 用 C 语言调整输出终端的大小

Javascript 检查列表是否在一次交换后排序

php - Eclipse:查找分布在多行中的查询字符串

javascript - js 搜索字符串并获取匹配的元素

jquery - 如何动态访问 JSON 对象的属性