2002-10-16 14:29:23 +00:00
|
|
|
.\"
|
|
|
|
.\" Initial implementation:
|
|
|
|
.\" Copyright (c) 2002 Robert Drehmel
|
|
|
|
.\" All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" As long as the above copyright statement and this notice remain
|
2002-12-09 13:14:15 +00:00
|
|
|
.\" unchanged, you can do what ever you want with this file.
|
2002-10-16 14:29:23 +00:00
|
|
|
.\"
|
|
|
|
.\" $FreeBSD$
|
|
|
|
.\"
|
2016-04-17 18:25:34 +00:00
|
|
|
.Dd April 17, 2016
|
2002-10-16 14:29:23 +00:00
|
|
|
.Dt LSEARCH 3
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
|
|
|
.Nm lsearch ,
|
|
|
|
.Nm lfind
|
|
|
|
.Nd linear search and append
|
|
|
|
.Sh LIBRARY
|
|
|
|
.Lb libc
|
|
|
|
.Sh SYNOPSIS
|
|
|
|
.In search.h
|
2002-12-09 13:14:15 +00:00
|
|
|
.Ft "void *"
|
|
|
|
.Fo lsearch
|
|
|
|
.Fa "const void *key" "void *base" "size_t *nelp" "size_t width"
|
|
|
|
.Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *\*[rp]"
|
|
|
|
.Fc
|
|
|
|
.Ft "void *"
|
|
|
|
.Fo lfind
|
|
|
|
.Fa "const void *key" "const void *base" "size_t *nelp" "size_t width"
|
|
|
|
.Fa "int \*[lp]*compar\*[rp]\*[lp]const void *, const void *\*[rp]"
|
|
|
|
.Fc
|
2002-10-16 14:29:23 +00:00
|
|
|
.Sh DESCRIPTION
|
|
|
|
The
|
|
|
|
.Fn lsearch
|
|
|
|
and
|
|
|
|
.Fn lfind
|
|
|
|
functions walk linearly through an array and compare each element with
|
|
|
|
the one to be sought using a supplied comparison function.
|
|
|
|
.Pp
|
2002-12-19 09:40:28 +00:00
|
|
|
The
|
2002-10-16 14:29:23 +00:00
|
|
|
.Fa key
|
2002-12-19 09:40:28 +00:00
|
|
|
argument
|
2002-10-16 14:29:23 +00:00
|
|
|
points to an element that matches the one that is searched.
|
2002-12-09 13:14:15 +00:00
|
|
|
The array's address in memory is denoted by the
|
2002-10-16 14:29:23 +00:00
|
|
|
.Fa base
|
|
|
|
argument.
|
2002-12-09 13:14:15 +00:00
|
|
|
The width of one element (i.e., the size as returned by
|
2002-10-16 14:29:23 +00:00
|
|
|
.Fn sizeof )
|
2002-12-09 13:14:15 +00:00
|
|
|
is passed as the
|
|
|
|
.Fa width
|
2002-10-16 14:29:23 +00:00
|
|
|
argument.
|
|
|
|
The number of valid elements contained in the array (not the number of
|
|
|
|
elements the array has space reserved for) is given in the integer pointed
|
|
|
|
to by
|
|
|
|
.Fa nelp .
|
|
|
|
The
|
|
|
|
.Fa compar
|
|
|
|
argument points to a function which compares its two arguments and returns
|
2002-12-09 13:14:15 +00:00
|
|
|
zero if they are matching, and non-zero otherwise.
|
2002-10-16 14:29:23 +00:00
|
|
|
.Pp
|
2002-12-09 13:14:15 +00:00
|
|
|
If no matching element was found in the array,
|
|
|
|
.Fn lsearch
|
2002-10-16 14:29:23 +00:00
|
|
|
copies
|
|
|
|
.Fa key
|
|
|
|
into the position after the last element and increments the
|
|
|
|
integer pointed to by
|
|
|
|
.Fa nelp .
|
|
|
|
.Sh RETURN VALUES
|
2002-12-18 12:45:11 +00:00
|
|
|
The
|
2002-10-16 14:29:23 +00:00
|
|
|
.Fn lsearch
|
|
|
|
and
|
|
|
|
.Fn lfind
|
2002-12-18 12:45:11 +00:00
|
|
|
functions
|
2002-10-16 14:29:23 +00:00
|
|
|
return a pointer to the first element found.
|
|
|
|
If no element was found,
|
|
|
|
.Fn lsearch
|
|
|
|
returns a pointer to the newly added element, whereas
|
|
|
|
.Fn lfind
|
|
|
|
returns
|
|
|
|
.Dv NULL .
|
|
|
|
Both functions return
|
|
|
|
.Dv NULL
|
|
|
|
if an error occurs.
|
2013-04-21 10:30:19 +00:00
|
|
|
.Sh EXAMPLES
|
|
|
|
.Bd -literal
|
|
|
|
#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) {
|
2016-04-17 18:25:34 +00:00
|
|
|
printf("Bad input\en");
|
2013-04-21 10:30:19 +00:00
|
|
|
return (EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
element = lfind(&key, array, &array_size, element_size,
|
|
|
|
element_compare);
|
|
|
|
|
|
|
|
if (element != NULL)
|
2016-04-17 18:25:34 +00:00
|
|
|
printf("Element found: %d\en", *(int *)element);
|
2013-04-21 10:30:19 +00:00
|
|
|
else
|
2016-04-17 18:25:34 +00:00
|
|
|
printf("Element not found\en");
|
2013-04-21 10:30:19 +00:00
|
|
|
|
|
|
|
return (EXIT_SUCCESS);
|
|
|
|
}
|
|
|
|
.Ed
|
2002-10-16 14:29:23 +00:00
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr bsearch 3 ,
|
|
|
|
.Xr hsearch 3 ,
|
|
|
|
.Xr tsearch 3
|
2005-01-20 09:17:07 +00:00
|
|
|
.Sh STANDARDS
|
|
|
|
The
|
|
|
|
.Fn lsearch
|
|
|
|
and
|
|
|
|
.Fn lfind
|
|
|
|
functions conform to
|
|
|
|
.St -p1003.1-2001 .
|
2002-10-16 14:29:23 +00:00
|
|
|
.Sh HISTORY
|
|
|
|
The
|
|
|
|
.Fn lsearch
|
|
|
|
and
|
|
|
|
.Fn lfind
|
|
|
|
functions appeared in
|
|
|
|
.Bx 4.2 .
|
|
|
|
In
|
|
|
|
.Fx 5.0 ,
|
|
|
|
they reappeared conforming to
|
|
|
|
.St -p1003.1-2001 .
|