Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compare)(const void*, const void*));Параметры и их назначение сходны с таковыми для
qsort()const void *keyОбъект, который ищется в массиве.
const void *baseНачало массива.
size_t nmembЧисло элементов в массиве.
size_t sizeРазмер каждого элемента, полученный с помощью
sizeofint (*compare)(const void*, const void*)Функция сравнения. Она должна работать таким же образом, как функция сравнения для
qsort()Если объект не найден,
bsearch()NULLkeyqsort()ch06-searchemp.cbsearch()struct employee1 /* ch06-searchemp.с ---- Демонстрация bsearch(). */23 #include <stdio.h>4 #include <errno.h>5 #include <stdlib.h>67 struct employee {8 char lastname[30];9 char firstname[30];10 long emp_id;11 time_t start_date;12 };1314 /* emp_id_compare --- сравнение по ID */1516 int emp_id_compare(const void *e1p, const void *e2p)17 {18 const struct employee *e1, *e2;1920 e1 = (const struct employee*)e1p;21 e2 = (const struct employee*)e2p;2223 if (e1->emp_id < e2->emp_id)24 return -1;25 else if (e1->emp_id == e2->emp_id)26 return 0;27 else28 return 1;29 }3031 /* print_employee --- напечатать структуру сотрудника */3233 void print_employee(const struct employee *emp)34 {35 printf("%s %st%dt%s", emp->lastname, emp->firstname,36 emp->emp_id, ctime(&emp->start_date));37 }Строки 7–12 определяют
struct employeeqsort()bsearch()print_employee()39 /* main --- демонстрация сортировки */4041 int main(int argc, char **argv)42 {43 #define NPRES 1044 struct employee presidents[NPRES];45 int i, npres;46 char buf[BUFSIZ];47 struct employee *the_pres;48 struct employee key;49 int id;50 FILE *fp;5152 if (argc != 2) {53 fprintf(stderr, "usage: %s datafilen", argv[0]);54 exit(1);55 }5657 if ((fp = fopen(argv[1], "r")) == NULL) {58 fprintf(stderr, "%s: %s: could not open: %sn", argv[0],59 argv[1], strerror(errno));60 exit(1);61 }6263 /* Очень простой код для чтения данных: */64 for (npres = 0; npres < NPRES && fgets(buf, BUFSIZ, fp) != NULL;65 npres++) {66 sscanf(buf, "%s %s %ld %ld",67 presidents[npres].lastname,68 presidents[npres].firstname,69 &presidents[npres].emp_id,70 &presidents[npres].start_date);71 }72 fclose(fp);7374 /* В npres теперь число действительно прочитанных строк. */7576 /* Сначала отсортировать по id */77 qsort(presidents, npres, sizeof(struct employee), emp_id_compare);