指定されたキーの線形探索を実行します。Performs a linear search for the specified key. CRT のセキュリティ機能」の説明にあるとおり、セキュリティが強化されたバージョンの _lfind です。A version of _lfind with security enhancements as described in Security Features in the CRT.


void *_lfind_s(
   const void *key,
   const void *base,
   unsigned int *num,
   size_t size,
   int (__cdecl *compare)(void *, const void *, const void *),
   void * context


検索するオブジェクト。Object to search for.

検索データのベースへのポインター。Pointer to the base of search data.

配列要素の数。Number of array elements.

バイト単位での配列要素のサイズ。Size of array elements in bytes.

比較ルーチンへのポインター。Pointer to comparison routine. 最初のパラメーターは、コンテキストポインター。The first parameter is the context pointer. 2 番目のパラメーターは、検索用のキーへのポインターです。The second parameter is a pointer to key for search. 3 番目のパラメーターは、キーと比較する配列要素へのポインターです。The third parameter is a pointer to array element to be compared with key.

比較関数内でアクセスされることのあるオブジェクトへのポインター。A pointer to an object that might be accessed in the comparison function.

戻り値Return Value

キーが見つかった場合 _lfind_s配列の要素へのポインターを返します基本と一致するキーします。If the key is found, _lfind_s returns a pointer to the element of the array at base that matches key. キーが見つからない場合 _lfind_s返しますNULLします。If the key is not found, _lfind_s returns NULL.

この関数に無効なパラメーターが渡されると、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。If invalid parameters are passed to the function, the invalid parameter handler is invoked, as described in Parameter Validation. 続けるには、実行が許可された場合errnoに設定されているEINVAL 、関数を返しますNULLします。If execution is allowed to continue, errno is set to EINVAL and the function returns NULL.

エラー条件Error Conditions

keykey basebase comparecompare numnum sizesize errnoerrno
NULLNULL 任意any 任意any 任意any 任意any EINVALEINVAL
任意any NULLNULL 任意any != 0!= 0 任意any EINVALEINVAL
任意any 任意any 任意any 任意any ゼロzero EINVALEINVAL
任意any 任意any NULLNULL 1 つan 任意any EINVALEINVAL


_Lfind_s関数は、値に関して線形探索を実行します。キーの配列のの各要素は、バイト。The _lfind_s function performs a linear search for the value key in an array of number elements, each of width bytes. 異なりbsearch_s_lfind_s配列を並べ替えるには必要ありません。Unlike bsearch_s, _lfind_s does not require the array to be sorted. 基本引数は、検索する配列のベースへのポインター。The base argument is a pointer to the base of the array to be searched. 比較引数が 2 つの配列要素を比較し、その関係を示す値を返します、ユーザー指定のルーチンへのポインター。The compare argument is a pointer to a user-supplied routine that compares two array elements and then returns a value specifying their relationship. _lfind_s呼び出し、比較ルーチンを 1 つまたは複数回渡すこと、検索中に、コンテキストポインターと各呼び出しにおいて 2 つの配列要素へのポインター。_lfind_s calls the compare routine one or more times during the search, passing the context pointer and pointers to two array elements on each call. 比較ルーチンには、要素を比較し、0 以外の場合 (つまり、要素が異なる) を返す必要があります (つまり、要素が同じ場合) は 0。The compare routine must compare the elements then return nonzero (meaning that the elements are different) or 0 (meaning the elements are identical).

_lfind_sのような _lfindの追加を除く、コンテキスト比較関数の引数と関数のパラメーター リストへのポインター。_lfind_s is similar to _lfind except for the addition of the context pointer to the arguments of the comparison function and the parameter list of the function. コンテキストポインターは検索対象のデータ構造体がオブジェクトの一部である場合に便利にできる、比較関数は、オブジェクトのメンバーにアクセスする必要があります。The context pointer can be useful if the searched data structure is part of an object and the compare function needs to access members of the object. 比較関数はそのオブジェクトの適切なオブジェクトの種類とアクセスのメンバーに void ポインターをキャストすることができます。The compare function can cast the void pointer into the appropriate object type and access members of that object. 追加、コンテキストパラメーターにより、 _lfind_s追加のコンテキストに関連付けられたデータを使用できるようにする静的変数を使用して、再入バグを回避するために使用できるためのより安全な比較関数。The addition of the context parameter makes _lfind_s more secure because additional context can be used to avoid reentrancy bugs associated with using static variables to make data available to the compare function.


ルーチンによって返される値Routine 必須ヘッダーRequired header
_lfind_s_lfind_s <search.h><search.h>

互換性の詳細については、「 互換性」を参照してください。For more compatibility information, see Compatibility.


// crt_lfind_s.cpp
// This program uses _lfind_s to search a string array,
// passing a locale as the context.
// compile with: /EHsc
#include <stdlib.h>
#include <stdio.h>
#include <search.h>
#include <process.h>
#include <locale.h>
#include <locale>
#include <windows.h>
using namespace std;

// The sort order is dependent on the code page.  Use 'chcp' at the
// command line to change the codepage.  When executing this application,
// the command prompt codepage must match the codepage used here:

#define CODEPAGE_850

#ifdef CODEPAGE_850
// Codepage 850 is the OEM codepage used by the command line,
// so \x00e1 is the German Sharp S

char *array1[] = { "wei\x00e1", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };

#define GERMAN_LOCALE "German_Germany.850"


#ifdef CODEPAGE_1252
   // If using codepage 1252 (ISO 8859-1, Latin-1), use \x00df
   // for the German Sharp S
char *array1[] = { "wei\x00df", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };

#define GERMAN_LOCALE "German_Germany.1252"


// The context parameter lets you create a more generic compare.
// Without this parameter, you would have stored the locale in a
// static variable, thus making it vulnerable to thread conflicts
// (if this were a multithreaded program).

int compare( void *pvlocale, const void *str1, const void *str2)
    char *s1 = *(char**)str1;
    char *s2 = *(char**)str2;

    locale& loc = *( reinterpret_cast< locale * > ( pvlocale));

    return use_facet< collate<char> >(loc).compare(
       s1, s1+strlen(s1),
       s2, s2+strlen(s2) );

void find_it( char *key, char *array[], unsigned int num, locale &loc )
   char **result = (char **)_lfind_s( &key, array,
                      &num, sizeof(char *), compare, &loc );
   if( result )
      printf( "%s found\n", *result );
      printf( "%s not found\n", key );

int main( )
   find_it( "weit", array1, sizeof(array1)/sizeof(char*), locale(GERMAN_LOCALE) );
weit found

関連項目See also

検索と並べ替えSearching and Sorting