Share via


_lfind_s

Executa uma Pesquisar linear da chave especificada.Uma versão do _lfind com aprimoramentos de segurança sistema autônomo descrito em Aprimoramentos de segurança no 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
);

Parâmetros

  • key
    Objeto para pesquisar.

  • base
    Ponteiro para a base de dados de Pesquisar.

  • num
    Número de elementos da matriz.

  • size
    dimensionar dos elementos da matriz em bytes.

  • compare
    Ponteiro para a rotina de comparação.O primeiro parâmetro é o context ponteiro. O segundo parâmetro é um ponteiro para a chave de Pesquisar.O terceiro parâmetro é um ponteiro para o elemento de matriz a ser comparado com a tecla.

  • context
    Um ponteiro para um objeto que pode ser acessado na função de comparação.

Valor de retorno

Se a chave for encontrado, _lfind_s Retorna um ponteiro para o elemento da matriz em base que corresponde ao key. Se a chave não for encontrado, _lfind_s Retorna NULL.

Se parâmetros inválidos psistema autônomosed para a função, o manipulador de parâmetro inválido é invocado, sistema autônomo descrito em Validação de parâmetro. If execution is allowed to continue, errno is set to EINVAL and the function returns NULL.

Condições de erro

key

Base

Comparar

num

dimensionar

errno

NULL

any

any

any

any

EINVAL

any

NULL

any

!= 0

any

EINVAL

any

any

any

any

zero

EINVAL

any

any

NULL

um

any

EINVAL

Comentários

The _lfind_s função realiza uma Pesquisar linear para o valor key em uma matriz de num elementos, cada um dos width bytes. Ao contrário de bsearch_s, _lfind_s não requer que o array a ser classificado. The base argumento é um ponteiro para a base da matriz a ser pesquisada. The compare argumento é um ponteiro para uma rotina fornecido pelo usuário que compara dois elementos de matriz e retorna um valor especificando suas relações. _lfind_s chamadas a compare rotina uma ou mais vezes durante a Pesquisar, passando o context ponteiro e ponteiros para os dois elementos de matriz em cada telefonar. The compare rotina deve comparar os elementos depois retornar diferente de zero (o que significa que os elementos são diferentes) ou 0 (ou seja, os elementos são idênticos).

_lfind_s é semelhante a _lfind exceto para a adição da context ponteiro para os argumentos da função de comparação e a lista de parâmetros da função. The context ponteiro pode ser útil se a estrutura de dados pesquisado é parte de um objeto e o compare função precisa acessar os membros do objeto. The compare função pode converter o ponteiro void os membros de tipo e o acesso do objeto apropriado desse objeto. A adição do context torna o parâmetro _lfind_s mais seguro porque contexto adicional pode ser usado para evitar bugs reentrância associados ao uso de variáveis estáticas para disponibilizar dados para o compare função.

Requisitos

Rotina

Cabeçalho necessário

_lfind_s

<Pesquisar.h>

Para obter mais informações de compatibilidade, consulte Compatibility na introdução.

Exemplo

// 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"

#endif

#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"

#endif

// 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 );
   else
      printf( "%s not found\n", key );
}

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

weit found

Equivalente do NET Framework

Contains

Consulte também

Referência

Pesquisa e classificação

bsearch_s

_lsearch_s

qsort_s

_lfind