Есть ли способ найти положение элемента при поиске массива char с помощью bsearch()

В первый раз, используя bsearch(), и мне было интересно, есть ли способ найти положение элемента или вернуть элемент??

У меня работает bsearch(), и он возвращает указатель, но из-за этого я не могу использовать его для печати элемента.

void choose_food_item(){
char food[20];
int qty;
int size = sizeof (food_stuff_choices) / sizeof (*fs);
char * ptr_item;
do{
printf("\nPlease Choose Your Food Items!!! When finished enter display to view plan\n");
fflush(stdout);
gets(food); // searchkey

/* sort the elements of the array */
qsort(food_stuff_choices,size,sizeof(*fs),(int(*)(const void*,const void*)) strcmp);

/* search for the searchkey */
ptr_item = (char*)
bsearch (food,food_stuff_choices,size,sizeof(*fs),(int(*)(const void*,const void*)) strcmp);

if (ptr_item!=NULL){
    //printf("%d\n",(int)*ptr_item);
    printf("Please Enter Quantity\n");
    fflush(stdout);
    scanf("%d",&qty);
    food_plan_item item = {food_stuff_choices[0], qty};
    add_food_plan_item(item);
}
else
    printf ("%s not found in the array.\n",food);

}while(strcmp("display",food) != 0);
}

2 ответа

Решение

bsearch возвращает указатель на найденный элемент.

Вычтите этот адрес из адреса нулевого элемента.

Затем делится на длину элемента.

Это дает вам индекс для элемента.

Ты можешь использовать

pos=((int)ptr_item-(int)food_stuff_choices)/sizeof(char);

Объяснение: при этом будет принят адрес вашего элемента, возвращенного функцией bsearch(), и приведен его тип в целочисленном формате, затем он получит адрес первого элемента в позиции вашего массива и преобразует его в целое число. затем возьмите разницу между ними и разделите на размер типа списка, то есть char

этот код даст вам pos, которая является позицией элемента в массиве

если вы хотите только напечатать значение (без позиции), то для вас подойдет следующий код:

printf("%s",*food_stuff_choices);
Другие вопросы по тегам