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

Проблема в том, что ключ увеличивается, но bsearch все еще ищет число 50. Я думаю, потому что ключевой аргумент в bsearch это constant pointer, Я знаю, что это работает, если все ключи хранятся в массиве до поиска. Тем не менее, это не подходит для моего приложения. Любая помощь будет оценена.

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
Другие вопросы по тегам