Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here. ArchiveDisclaimer


Performs a linear search for a value; adds to end of list if not found.

void *_lsearch(
   const void *key,
   void *base,
   unsigned int *num,
   unsigned int width,
   int (__cdecl *compare)(const void *, const void *) 


Object to search for.
Pointer to base of array to be searched.
Number of elements.
Width of each array element.
Pointer to comparison routine. The first parameter is a pointer to key for search. The second parameter is a pointer to array element to be compared with key.

Return Value

If the key is found, _lsearch returns a pointer to the element of the array at base that matches key. If the key is not found, _lsearch returns a pointer to the newly added item at the end of the array.


The _lsearch function performs a linear search for the value key in an array of num elements, each of width bytes in size. Unlike bsearch, _lsearch does not require the array to be sorted. If key is not found, _lsearch adds it to the end of the array and increments num.

The compare argument is a pointer to a user-supplied routine that compares two array elements and returns a value specifying their relationship. _lsearch calls the compare routine one or more times during the search, passing pointers to two array elements on each call. compare must compare the elements, then return either nonzero, meaning the elements are different, or 0, meaning the elements are identical.


Routine Required header Compatibility
_lsearch <search.h> Win 98, Win Me, Win NT, Win 2000, Win XP

For additional compatibility information, see Compatibility in the Introduction.


All versions of the C run-time libraries.


// crt_lsearch.c

#include <search.h>
#include <string.h>
#include <stdio.h>

int compare( const void *arg1, const void *arg2 );

int main(void)
   char * wordlist[4] = { "hello", "thanks", "bye" };
                            // leave room to grow...
   int n = 3;
   char **result;
   char *key = "extra";
   int i;

   printf( "wordlist before _lsearch:" );
   for( i=0; i<n; ++i ) printf( " %s", wordlist[i] );
   printf( "\n" );

   result = (char **)_lsearch( &key, wordlist, 
                      &n, sizeof(char *), compare );

   printf( "wordlist after _lsearch:" );
   for( i=0; i<n; ++i ) printf( " %s", wordlist[i] );
   printf( "\n" );

int compare(const void *arg1, const void *arg2 )
   return( _stricmp( * (char**)arg1, * (char**)arg2 ) );


wordlist before _lsearch: hello thanks bye
wordlist after _lsearch: hello thanks bye extra

See Also

Searching and Sorting Routines | bsearch | _lfind | Run-Time Routines and .NET Framework Equivalents

© 2015 Microsoft