Есть ли способ найти положение элемента при поиске массива 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);