lsearch

Aus RAD Studio
Wechseln zu: Navigation, Suche

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++

+