lsearch
Nach oben zu stdlib.h - Index
Header-Datei
stdlib.h
Kategorie
Routinen für Speicher- und String-Bearbeitung
Prototyp
void *lsearch(const void *key, void *base, size_t *num, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));
Beschreibung
Führt eine lineare Suche durch.
lsearch durchsucht eine Tabelle nach einem bestimmten Eintrag. Da eine lineare Suche durchgeführt wird, müssen die Tabelleneinträge vor dem Aufruf von lsearch nicht sortiert werden. Wird das Element, auf das key zeigt, in der Tabelle nicht gefunden, wird es an das Tabellenende angehängt.
- base zeigt auf das Element 0 der zu durchsuchenden Tabelle.
- Die Integerwert, auf den num zeigt, enthält die Anzahl der Tabelleneinträge.
- width gibt in Bytes die Größe jedes Tabelleneintrags an.
- key zeigt auf das Element, nach dem gesucht wird (der Suchschlüssel).
Die Funktion fcmp muss mit der Aufrufkonvention _USERENTRY deklariert werden.
Das Argument fcmp zeigt auf eine benutzerdefinierte Vergleichsroutine, die zwei Elemente miteinander vergleicht und einen vom Ergebnis des Vergleichs abhängigen Wert zurückgibt.
Bei der Suche in der Tabelle ruft lsearch wiederholt die Routine auf, deren Adresse in fcmp übergeben wird.
Bei jedem Aufruf der Vergleichsroutine übergibt ihr lsearch zwei Argumente:
key |
ein Zeiger auf das Element, nach dem gesucht wird |
elem |
ein Zeiger auf das Element von base, mit dem verglichen wird. |
fcmp kann das Verhältnis des Suchschlüssels zu den Tabelleneinträgen beliebig interpretieren.
Rückgabewert
lsearch gibt die Adresse des ersten Eintrags in der Tabelle zurück, der mit dem Suchschlüssel übereinstimmt.
Stimmt der Suchschlüssel mit *elem nicht überein, gibt fcmp einen Wert ungleich Null zurück. Stimmt der Suchschlüssel mit *elem überein, gibt fcmp 0 zurück.
Beispiel
#include <stdlib.h>
#include <stdio.h>
#include <string.h> /* Für die strcmp-Deklaration */
/* Farben initialisieren */
char *colors[10] = { "Red", "Blue", "Green" };
int ncolors = 3;
int colorscmp(char **arg1, char **arg2)
{
return(strcmp(*arg1, *arg2));
}
int addelem(char **key)
{
int oldn = ncolors;
lsearch(key, colors, (size_t *)&ncolors, sizeof(char *),
(int(*)(const void *,const void *))colorscmp);
return(ncolors == oldn);
}
int main(void)
{
int i;
char *key = "Purple";
if (addelem(&key))
printf("%s already in colors table\n", key);
else
{
printf("%s added to colors table\n", key);
}
printf("The colors:\n");
for (i = 0; i < ncolors; i++)
printf("%s\n", colors[i]);
return 0;
}
Portabilität
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |