lsearch(), lfind()

Линейный поиск элемента в массиве

Прототип:

#include <search.h>
void * lsearch( const void *key, void *base, size_t *nelp, size_t width, int (*compar)( const void *, const void * ) );
void * lfind( const void *key, const void *base, size_t *nelp, size_t width, int (*compar)( const void *, const void * ) );

Аргументы:

key
Указатель на искомые данные.
base
Указатель на начало массива.
nelp
Количество элементов в массиве.
width
Размер элемента массива в байтах.
compar
Функция сравнения элементов массива. Она должна возвращать нулевое значение при равенстве элементов и ненулевое в противном случае.

Библиотека:

libc

Описание:

Функции lsearch() и lfind() обеспечивают базовую функциональность линейного поиска.

Параметр compar указывает на функцию, которая сравнивает два параметра и возвращает ноль если они совпадают и ненулевое значение в противном случае. Аргументы функции:

void *key
Переданный в lsearch() или lfind() аргумент key.
void *element
Указатель другой элемент массива, подлежащий сравнению с key.

Возвращаемое значение:

Функции lsearch() и lfind() возвращают указатель на элемент массива base, где находится key.

Если key не существует, lfind() возвращает нулевой указатель, а lsearch() добавляет его в массив.

Когда новый элемент добавлен в массив функцией lsearch(), nelp увеличивается на единицу.

Примеры:

Эта программа создает массив указателей на аргументы argv, выполняя их поиск в массиве указателей NULL. Поскольку ни один из элементов не будет найден, все они будут добавлены в массив.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <search.h>
int compare( const void *, const void * );
int main( int argc, const char **argv )
{
int i;
size_t num = 0;
char **array = (char **)calloc( argc, sizeof( char ** ) );
for ( i = 1; i < argc; ++i )
lsearch( &argv[i], array, &num, sizeof( char ** ), compare );
for ( i = 0; i < num; ++i )
printf( "%s\n", array[i] );
return (EXIT_SUCCESS);
}
int compare( const void *op1, const void *op2 )
{
const char **p1 = (const char **)op1;
const char **p2 = (const char **)op2;
return (strcmp( *p1, *p2 ));
}

Код выше генерирует следующий вывод:

$ ./a.out one two three four

Следующий пример позволяет узнать, является ли первый аргумент командной строки ключевым словом языка Cи (при условии, что предварительно был заполнен массив ключевых слов keywords полным списком ключевых слов языка):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <search.h>
static const char *keywords[] = {
"auto",
"break",
"case",
"char",
/* ... */
"while"
};
int compare( const void *, const void * );
int main( int argc, const char *argv[] )
{
size_t num = 5;
char *ptr;
if ( argc <= 1 )
return (EXIT_FAILURE);
ptr = lfind( &argv[1], keywords, &num, sizeof( char ** ), compare );
if ( ptr == NULL )
{
printf( "'%s' is not a C keyword\n", argv[1] );
return (EXIT_FAILURE);
} else {
printf( "'%s' is a C keyword\n", argv[1] );
return (EXIT_SUCCESS);
}
/* You'll never get here. */
return (EXIT_SUCCESS);
}
int compare( const void *op1, const void *op2 )
{
const char **p1 = (const char **)op1;
const char **p2 = (const char **)op2;
return (strcmp( *p1, *p2 ));
}

Классификация:

POSIX 1003.1 X/Open Systems Interfaces Extension

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Да
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

bsearch(), hsearch(), tsearch()




Предыдущий раздел: Описание API системной библиотеки