Программирование на C и C++

Онлайн справочник программиста на C и C++

lfind, lsearch

void *lfind(const void *key, const void *base, size_t *num, size_t size, int (*compare)(const *void, const *void))

void *lsearch(const void *key, void *base, size_t *num, size_t size, int (*compare)(const *void, const *void))

Прототип: 
Описание: 

Эти функции не определены стандартом ANSI С.

Функции lfind() и lsearch() выполняют линейный поиск в массиве, на который указывает пара­метр base, и возвращают указатель на первый элемент, соответствующий ключу, на который ука­зывает параметр key. Число элементов в массиве определяется переменной, на которую указывает параметр num, а параметр size содержит размер каждого элемента в байтах.

Параметр compare указывает на функцию, сравнивающую элемент массива с ключом. Эта функ­ция имеет следующий формат:
int func_name(const void *arg1, const void *arg2)

Она должна возвращать следующие значения:
Если arg1 не равен arg2, то возвращается ненулевое значение.
Если arg1 равен arg2, то возвращается 0.

Массив, в котором осуществляется поиск, не обязательно должен быть отсортированным.

Если массив не содержит искомого элемента, то возвращается нулевой указатель.

Разница между функциями lfind() и lsearch() заключается в том, что функция lfind() выполняет только поиск. В противоположность этому, функция lsearch() добавляет элемент в конец массива, если он не содержался в этом массиве.

Пример: 
Следующая программа читает вводимые с клавиатуры символы и определяет, принадлежат ли они алфавиту:
#include <stdlib.h>
#include <ctype.h>
#include <stdio.h>

char *alpha="abcdefghijklmnopqrstuvwxyz";
int comp (const void *, const void *);

int main(void)
{
char ch;
char *p;
size_t num=26;
do {
printf("Enter a character: ");
scanf("%c%*c", &ch);
ch = tolower(ch);
p = (char *) lfind(&ch, alpha, &num, 1, comp);
if(p) printf("is in alphabet\n");
else printf("is not in alphabet\n");
} while(p);
return 0;
}

/* сравнение двух символов */
int comp (const void *ch, const void *s)
{
return * (char *)ch - *(char *)s;
}