Линейный поиск элемента в массиве
#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 * ) );
libc
Функции lsearch() и lfind() обеспечивают базовую функциональность линейного поиска.
Параметр compar указывает на функцию, которая сравнивает два параметра и возвращает ноль если они совпадают и ненулевое значение в противном случае. Аргументы функции:
Функции 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 системной библиотеки