Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Melakukan pencarian linier untuk kunci yang ditentukan. Versi _lfind dengan peningkatan keamanan seperti yang dijelaskan dalam Fitur keamanan di CRT.
Sintaks
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
);
Parameter
key
Objek yang akan dicari.
base
Penunjuk ke dasar data pencarian.
number
Jumlah elemen array.
size
Ukuran elemen array dalam byte.
compare
Penunjuk ke rutinitas perbandingan. Parameter pertama adalah penunjuk context . Parameter kedua adalah penunjuk ke kunci untuk pencarian. Parameter ketiga adalah elemen pointer to array yang akan dibandingkan dengan kunci.
context
Penunjuk ke objek yang mungkin diakses dalam fungsi perbandingan.
Nilai hasil
Jika kunci ditemukan, _lfind_s mengembalikan penunjuk ke elemen array yang base cocok keydengan . Jika kunci tidak ditemukan, _lfind_s mengembalikan NULL.
Jika parameter yang tidak valid diteruskan ke fungsi, handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, errno diatur ke EINVAL dan fungsi mengembalikan NULL.
Kondisi kesalahan
key |
base |
compare |
number |
size |
errno |
|---|---|---|---|---|---|
NULL |
any | any | any | any | EINVAL |
| any | NULL |
any | != 0 | any | EINVAL |
| any | any | any | any | zero | EINVAL |
| any | any | NULL |
an | any | EINVAL |
Keterangan
Fungsi ini _lfind_s melakukan pencarian linier untuk nilai key dalam array number elemen, masing-masing size byte. Tidak seperti bsearch_s, _lfind_s tidak mengharuskan array diurutkan. Argumen base adalah penunjuk ke dasar array yang akan dicari. Argumen compare adalah penunjuk ke rutinitas yang disediakan pengguna yang membandingkan dua elemen array lalu mengembalikan nilai yang menentukan hubungan mereka. _lfind_scompare memanggil rutinitas satu atau beberapa kali selama pencarian, meneruskan context pointer dan pointer ke dua elemen array pada setiap panggilan. compare Rutinitas harus membandingkan elemen kemudian mengembalikan nonzero (artinya elemennya berbeda) atau 0 (artinya elemennya identik).
_lfind_s mirip _lfind dengan kecuali untuk penambahan context penunjuk ke argumen fungsi perbandingan dan daftar parameter fungsi. Penunjuk context dapat berguna jika struktur data yang dicari adalah bagian dari objek dan compare fungsi perlu mengakses anggota objek. Fungsi ini compare dapat mentransmisikan penunjuk ke dalam jenis objek yang sesuai dan mengakses anggota objek tersebut. Penambahan context parameter menjadi _lfind_s lebih aman karena konteks tambahan dapat digunakan untuk menghindari bug reentransi yang terkait dengan penggunaan variabel statis untuk membuat data tersedia untuk compare fungsi.
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.
Persyaratan
| Rutin | Header yang diperlukan |
|---|---|
_lfind_s |
<search.h> |
Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Contoh
// 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