lsearch

提供: RAD Studio
移動先: 案内検索

stdlib.h:インデックス への移動


ヘッダーファイル

stdlib.h

カテゴリ

メモリと文字列の操作ルーチン

プロトタイプ

void *lsearch(const void *key, void *base, size_t *num, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));

説明

線形検索を実行します。

lsearch は,テーブルから情報を検索します。線形検索なので,lsearch を呼び出す前にテーブルエントリを整列する必要はありません。key が指す項目がテーブルにない場合,lsearch は,その項目をテーブルに追加します。

  • base は,検索テーブルのベース(0 番めの要素)へのポインタです。
  • num は,テーブル内のエントリ数を表す整数へのポインタです。
  • width は,各エントリのバイト数を保持します。
  • key は,検索する項目(検索キー)へのポインタです。

関数 fcmp では,_USERENTRY 呼び出し規約を使用する必要があります。

引数 fcmp は,ユーザーが記述した比較ルーチンへのポインタです。このルーチンは,2 つの項目を比較し,その結果に基づいて値を返します。

テーブルを検索するために,lsearch は,fcmp でアドレスが渡されたルーチンを繰り返し呼び出します。

比較ルーチンを呼び出すたびに,lsearch は次の 2 つの引数を渡します。

key

検索する項目へのポインタ

elem

比較される base の要素へのポインタ



fcmp は,検索キーとテーブルエントリを任意の方法で解釈できます。

戻り値

lsearch は,検索キーに一致するテーブル内の最初のエントリのアドレスを返します。

検索キーと *elem が異なる場合,fcmp は,0 以外の整数を返します。検索キーと *elem が同じ場合,fcmp は,0 を返します。



 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>     /* strcmp の宣言用 */
 /* 色の数を初期化します */
 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;
 }



移植性



POSIX Win32 ANSI C ANSI C++

+