qsort_sqsort_s

クイック ソートを実行します。Performs a quick sort. CRT のセキュリティ機能」の説明にあるとおり、セキュリティが強化されたバージョンの qsort です。A version of qsort with security enhancements as described in Security Features in the CRT.

構文Syntax

void qsort_s(
   void *base,
   size_t num,
   size_t width,
   int (__cdecl *compare )(void *, const void *, const void *),
   void * context
);

パラメーターParameters

basebase
対象となる配列の先頭。Start of target array.

numbernumber
配列サイズ (要素数)。Array size in elements.

widthwidth
要素のサイズ (バイト単位)。Element size in bytes.

comparecompare
比較関数。Comparison function. 最初の引数は、コンテキストポインター。The first argument is the context pointer. 2 番目の引数がへのポインター、キー検索します。The second argument is a pointer to the key for the search. 3 番目の引数と比較する配列要素へのポインターは、キーします。The third argument is a pointer to the array element to be compared with key.

contextcontext
オブジェクトのいずれかを指定できるコンテキストへのポインター、比較ルーチンがアクセスする必要があります。A pointer to a context, which can be any object that the compare routine needs to access.

RemarksRemarks

Qsort_s関数の配列を並べ替えるためのクイック ソート アルゴリズムを実装の各要素は、バイト。The qsort_s function implements a quick-sort algorithm to sort an array of number elements, each of width bytes. 引数基本を並べ替える配列のベースへのポインターです。The argument base is a pointer to the base of the array to be sorted. qsort_s並べ替えた要素でこの配列を上書きします。qsort_s overwrites this array with the sorted elements. 引数比較を 2 つの配列要素を比較し、その関係を示す値を返すユーザー指定のルーチンへのポインターです。The argument compare is a pointer to a user-supplied routine that compares two array elements and returns a value specifying their relationship. qsort_s呼び出し、比較ルーチンを 1 つまたは複数回呼び出しごとに 2 つの配列要素へのポインターを渡す、並べ替え中に。qsort_s calls the compare routine one or more times during the sort, passing pointers to two array elements on each call:

compare( context, (void *) & elem1, (void *) & elem2 );

ルーチンは、要素を比較し、次の値のいずれかを返す必要があります。The routine must compare the elements and then return one of the following values:

戻り値Return value 説明Description
< 0< 0 elem1未満elem2elem1 less than elem2
00 elem1等しくelem2elem1 equivalent to elem2
> 0> 0 elem1より大きいelem2elem1 greater than elem2

配列は、比較関数による定義に従って、昇順で並べ替えられます。The array is sorted in increasing order, as defined by the comparison function. 配列を降順で並べ替えるには、比較関数の "より大きい" と "より小さい" の意味を入れ替えます。To sort an array in decreasing order, reverse the sense of "greater than" and "less than" in the comparison function.

この関数に無効なパラメーターが渡されると、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。If invalid parameters are passed to the function, the invalid parameter handler is invoked, as described in Parameter Validation. 実行の継続が許可されたかどうかは、関数を返しますとerrnoに設定されているEINVALします。If execution is allowed to continue, then the function returns and errno is set to EINVAL. 詳細については、「errno、_doserrno、_sys_errlist、_sys_nerr」をご覧ください。For more information, see errno, _doserrno, _sys_errlist, and _sys_nerr.

エラー条件Error Conditions

keykey basebase comparecompare numnum width errnoerrno
NULLNULL 任意any 任意any 任意any 任意any EINVALEINVAL
任意any NULLNULL 任意any != 0!= 0 任意any EINVALEINVAL
任意any 任意any 任意any 任意any <= 0<= 0 EINVALEINVAL
任意any 任意any NULLNULL 任意any 任意any EINVALEINVAL

qsort_sとして動作は同じqsortいますが、コンテキストパラメーターとセットerrnoします。qsort_s has the same behavior as qsort but has the context parameter and sets errno. 渡すことによって、コンテキストパラメーター、比較関数オブジェクト ポインターを使用できます、要素ポインターでオブジェクトの機能またはアクセスできません。 その他の情報にアクセスします。By passing a context parameter, comparison functions can use an object pointer to access object functionality or other information not accessible through an element pointer. 追加、コンテキストパラメーターにより、 qsort_sためにのより安全なコンテキストする静的変数を使用して、再入バグを回避するために使用できます利用可能な情報を共有、比較関数。The addition of the context parameter makes qsort_s more secure because context can be used to avoid reentrancy bugs introduced by using static variables to make shared information available to the compare function.

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
qsort_sqsort_s <stdlib.h> および <search.h><stdlib.h> and <search.h>

互換性の詳細については、「 互換性」を参照してください。For additional compatibility information, see Compatibility.

ライブラリ: すべてのバージョン、 CRT ライブラリの機能します。Libraries: All versions of the CRT Library Features.

Example

次の例では、使用する方法、コンテキストパラメーター、 qsort_s関数。The following example demonstrates how to use the context parameter in the qsort_s function. コンテキストパラメーターにより、スレッド セーフの並べ替えを実行しやすくします。The context parameter makes it easier to perform thread-safe sorts. 同期のスレッド セーフを確保する必要のある静的変数を使用せずに渡す別コンテキスト並べ替えごとにパラメーター。Instead of using static variables that must be synchronized to ensure thread safety, pass a different context parameter in each sort. この例では、ロケール オブジェクトとして使用されます、コンテキストパラメーター。In this example, a locale object is used as the context parameter.

// crt_qsort_s.cpp
// compile with: /EHsc /MT
#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 in that codepage and \x00a4
// is the n tilde.

char *array1[] = { "wei\x00e1", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };
char *array2[] = { "Espa\x00a4ol", "Espa\x00a4" "a", "espantado" };
char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.850"
#define SPANISH_LOCALE "Spanish_Spain.850"
#define ENGLISH_LOCALE "English_US.850"

#endif

#ifdef CODEPAGE_1252
   // If using codepage 1252 (ISO 8859-1, Latin-1), use \x00df
   // for the German Sharp S and \x001f for the n tilde.
char *array1[] = { "wei\x00df", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };
char *array2[] = { "Espa\x00f1ol", "Espa\x00f1" "a", "espantado" };
char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.1252"
#define SPANISH_LOCALE "Spanish_Spain.1252"
#define ENGLISH_LOCALE "English_US.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 sort_array vulnerable to thread
// conflicts.

int compare( void *pvlocale, const void *str1, const void *str2)
{
    char s1[256];
    char s2[256];
    strcpy_s(s1, 256, *(char**)str1);
    strcpy_s(s2, 256, *(char**)str2);
    _strlwr_s( s1, sizeof(s1) );
    _strlwr_s( s2, sizeof(s2) );

    locale& loc = *( reinterpret_cast< locale * > ( pvlocale));

    return use_facet< collate<char> >(loc).compare(s1,
       &s1[strlen(s1)], s2, &s2[strlen(s2)]);

}

void sort_array(char *array[], int num, locale &loc)
{
    qsort_s(array, num, sizeof(char*), compare, &loc);
}

void print_array(char *a[], int c)
{
   for (int i = 0; i < c; i++)
      printf("%s ", a[i]);
   printf("\n");

}

void sort_german(void * Dummy)
{
   sort_array(array1, 6, locale(GERMAN_LOCALE));
}

void sort_spanish(void * Dummy)
{
   sort_array(array2, 3, locale(SPANISH_LOCALE));
}

void sort_english(void * Dummy)
{
   sort_array(array3, 3, locale(ENGLISH_LOCALE));
}

int main( )
{
   int i;
   HANDLE threads[3];

   printf("Unsorted input:\n");
   print_array(array1, 6);
   print_array(array2, 3);
   print_array(array3, 3);

   // Create several threads that perform sorts in different
   // languages at the same time.

   threads[0] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_german , 0, NULL));
   threads[1] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_spanish, 0, NULL));
   threads[2] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_english, 0, NULL));

   for (i = 0; i < 3; i++)
   {
      if (threads[i] == reinterpret_cast<HANDLE>(-1))
      {
         printf("Error creating threads.\n");
         exit(1);
      }
   }

   // Wait until all threads have terminated.
   WaitForMultipleObjects(3, threads, true, INFINITE);

   printf("Sorted output: \n");

   print_array(array1, 6);
   print_array(array2, 3);
   print_array(array3, 3);
}

出力例Sample Output

Unsorted input:
weiß weis annehmen weizen Zeit weit
Español España espantado
table tableux tablet
Sorted output:
annehmen weiß weis weit weizen Zeit
España Español espantado
table tablet tableux

関連項目See also

検索と並べ替えSearching and Sorting
bsearch_sbsearch_s
_lsearch_s_lsearch_s
qsortqsort