EN JA
LSEARCH(3)
LSEARCH(3) FreeBSD Library Functions Manual LSEARCH(3)

名称

lsearch, lfind線形 (リニア) 検索と追加

ライブラリ

Standard C Library (libc, -lc)

書式

#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 *));

解説

lsearch() と lfind() 関数は、配列の中を線形 (直線的) に渡り歩き、供給された比較関数を使用して、各要素 (エレメント) とシークされる (探される) ものとを比較します。

key 引数は、検索されるものに一致する要素を指します。メモリ中の配列のアドレスは、 base 引数によって示されます。 1 つの要素の幅 (すなわち、 sizeof() によって返されるサイズ) は、 width 引数として渡されます。 (配列の要素の数には、予約されている空間がない) 配列に含まれる有効な要素の数は、 nelp によって指された整数で与えられます。 compar 引数は、2 つの引数を比較して、一致すれば 0 を返し、そうでなければ 0 以外を返す関数を指します。

配列に一致する要素が見つけられないなら、 lsearch() は、最後の要素の後ろの位置に key をコピーし、 nelp によって指される整数を増加します。

戻り値

lsearch() と lfind() 関数は、見つけられた最初の要素 (エレメント) へのポインタを返します。何も要素も見つからなかったなら、 lsearch() は、新たに追加された要素へのポインタを返すのに対して、 lfind() は、 NULL を返します。エラーが生じるなら、両方の関数は、 NULL を返します。

使用例

#include <search.h> 
#include <stdio.h> 
#include <stdlib.h> 
 
static int 
element_compare(const void *p1, const void *p2) 
{ 
 int left = *(const int *)p1; 
 int right = *(const int *)p2; 
 
 return (left - right); 
} 
 
int 
main(int argc, char **argv) 
{ 
 const int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
 size_t element_size = sizeof(array[0]); 
 size_t array_size = sizeof(array) / element_size; 
 int key; 
 void *element; 
 
 printf("Enter a number: "); 
 if (scanf("%d", &key) != 1) { 
  printf("Bad input0); 
  return (EXIT_FAILURE); 
 } 
 
 element = lfind(&key, array, &array_size, element_size, 
     element_compare); 
 
 if (element != NULL) 
  printf("Element found: %d0, *(int *)element); 
 else 
  printf("Element not found0); 
 
 return (EXIT_SUCCESS); 
}

規格

lsearch() と lfind() 関数は、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合しています。

歴史

lsearch() と lfind() 関数は、 4.2BSD で登場しました。 FreeBSD 5.0 で、それらは、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合して再登場しました。
April 21, 2013 FreeBSD