bsearch, bsearch_s
|
Défini dans l'en-tête
<stdlib.h>
|
||
| (1) | ||
|
void
*
bsearch_s
(
const
void
*
key,
const
void
*
ptr, rsize_t count, rsize_t size,
int
(
*
comp
)
(
const
void
*
,
const
void
*
,
void
*
)
,
|
(2) | (depuis C11) |
| (3) | (depuis C23) | |
|
/*QVoid*/
*
bsearch_s
(
const
void
*
key,
/*QVoid*/
*
ptr, rsize_t count, rsize_t size,
int
(
*
comp
)
(
const
void
*
,
const
void
*
,
void
*
)
,
|
(4) | (depuis C23) |
key
dans un tableau pointé par
ptr
. Le tableau contient
count
éléments de
size
octets et doit être partitionné par rapport à
key
, c'est-à-dire que tous les éléments qui se comparent comme inférieurs doivent apparaître avant tous les éléments qui se comparent comme égaux, et ceux-ci doivent apparaître avant tous les éléments qui se comparent comme supérieurs à l'objet clé. Un tableau entièrement trié satisfait ces exigences. Les éléments sont comparés en utilisant la fonction pointée par
comp
. Le comportement est indéfini si le tableau n'est pas déjà partitionné par rapport à
*key
en ordre ascendant selon le même critère que
comp
utilise.
context
est passé à
comp
et que les erreurs suivantes sont détectées à l'exécution et appellent la fonction
constraint handler
actuellement installée :
-
-
countousizeest supérieur à RSIZE_MAX -
key,ptroucompest un pointeur nul (sauf sicountest zéro)
-
-
Comme pour toutes les fonctions à vérification de limites,
bsearch_s(et la macro générique correspondante) (depuis C23) n'est garantie d'être disponible que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ à la constante entière 1 avant d'inclure <stdlib.h> .
T
un type d'objet non qualifié (incluant
void
).
-
-
Si
ptrest de type const T * , le type de retour est const void * . -
Sinon, si
ptrest de type T * , le type de retour est void * . - Sinon, le comportement est indéfini.
-
Si
Si le tableau contient plusieurs éléments que
comp
indiquerait comme égaux à l'élément recherché, alors il n'est pas spécifié quel élément la fonction retournera comme résultat.
|
Les utilisations directes des fonctions réelles (1) et (2) sont dépréciées. |
(depuis C23) |
Table des matières |
Paramètres
| key | - | pointeur vers l'élément à rechercher |
| ptr | - | pointeur vers le tableau à examiner |
| count | - | nombre d'éléments dans le tableau |
| size | - | taille de chaque élément du tableau en octets |
| comp | - |
fonction de comparaison qui renvoie un entier négatif si le premier argument est
inférieur
au second, un entier positif si le premier argument est
supérieur
au second et zéro si les arguments sont équivalents.
key
est passé comme premier argument, un élément du tableau comme second.
La signature de la fonction de comparaison doit être équivalente à ce qui suit : int cmp ( const void * a, const void * b ) ; La fonction ne doit pas modifier les objets qui lui sont passés et doit renvoyer des résultats cohérents lorsqu'elle est appelée pour les mêmes objets, indépendamment de leur position dans le tableau. |
| context | - |
état du comparateur (par exemple, séquence de collationnement), passé à
comp
comme troisième argument
|
Valeur de retour
Notes
Malgré son nom, ni les normes C ni POSIX n'exigent que cette fonction soit implémentée en utilisant une recherche binaire ou ne fournissent aucune garantie de complexité.
Contrairement aux autres fonctions à vérification des limites,
bsearch_s
ne traite pas les tableaux de taille nulle comme une violation de contrainte d'exécution et indique plutôt l'élément non trouvé (l'autre fonction qui accepte les tableaux de taille nulle est
qsort_s
).
Jusqu'à
bsearch_s
, les utilisateurs de
bsearch
utilisaient souvent des variables globales pour représenter l'état du comparateur.
Exemple
#include <stdlib.h> #include <stdio.h> struct data { int nr; char const *value; } dat[] = { {1, "Foo"}, {2, "Bar"}, {3, "Hello"}, {4, "World"} }; int data_cmp(void const *lhs, void const *rhs) { struct data const *const l = lhs; struct data const *const r = rhs; if (l->nr < r->nr) return -1; else if (l->nr > r->nr) return 1; else return 0; // return (l->nr > r->nr) - (l->nr < r->nr); // possible shortcut // return l->nr - r->nr; // erroneous shortcut (fails if INT_MIN is present) } int main(void) { struct data key = { .nr = 3 }; struct data const *res = bsearch(&key, dat, sizeof dat / sizeof dat[0], sizeof dat[0], data_cmp); if (res) { printf("No %d: %s\n", res->nr, res->value); } else { printf("No %d not found\n", key.nr); } }
Sortie :
No 3: Hello
Références
- Norme C17 (ISO/CEI 9899:2018) :
-
- 7.22.5.1 La fonction bsearch (p: 258)
-
- K.3.6.3.1 La fonction bsearch_s (p: 441-442)
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.22.5.1 La fonction bsearch (p: 355)
-
- K.3.6.3.1 La fonction bsearch_s (p: 608-609)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.20.5.1 La fonction bsearch (p : 318-319)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 4.10.5.1 La fonction bsearch
Voir aussi
|
(C11)
|
trie une plage d'éléments de type non spécifié
(fonction) |
|
documentation C++
pour
bsearch
|
|