Visual Studio 2017 を使用することをお勧めします

qsort_s

 

公開日: 2016年7月

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

クイック ソートを実行します。 バージョンのqsort 」の説明に従って、セキュリティ強化機能を備えたCRT のセキュリティ機能です。

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

パラメーター

base
ターゲット配列の先頭。

num
配列の要素数。

width
要素のサイズ (バイト単位)。

compare
比較関数。 最初の引数は、 context ポインターです。 2 番目の引数は、検索用の key へのポインターです。 3 番目の引数は、 keyと比較する配列要素へのポインターです。

context
いずれかを指定できるコンテキストへのポインターがオブジェクトをcompareルーチンにアクセスする必要があります。

qsort_s関数の配列を並べ替えるためのクイック ソート アルゴリズムを実装numの各要素は、widthバイトです。 引数base並べ替え配列のベースへのポインターです。 qsort_s並べ替えられた要素では、この配列を上書きします。 引数compareを&2; つの配列要素を比較し、それらの関係を示す値を返しますユーザー指定のルーチンへのポインターです。 qsort_s呼び出し、compareルーチンの&1; つまたは複数回呼び出しごとに&2; つの配列要素へのポインターを渡す、並べ替え中にします。

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

ルーチンは、要素を比較し、次の値のいずれかを返す必要があります。

戻り値説明
< 0elem1elem2 より小さい
0elem1相当する機能elem2
> 0elem1elem2 より大きい

比較関数で定義されている配列は、昇順で並べ替えられます。 降順で配列を並べ替えるには、「大なり」と「より小さい」比較関数での意味を反転します。

無効なパラメーターが関数に渡された場合、無効なパラメーター ハンドラーが呼び出される」の説明に従ってパラメーターの検証します。 続けるには、実行が許可されたかどうかは、この関数を返しますとerrnoに設定されているEINVALします。 詳細については、次を参照してください。 errno、_doserrno、_sys_errlist、および _sys_nerrします。

エラー条件

keybasecomparenumerrno
NULL任意任意任意任意EINVAL
任意NULL任意!= 0任意EINVAL
任意任意任意任意<= 0EINVAL
任意任意NULL任意任意EINVAL

qsort_s同じ動作を持つqsortが、contextパラメーターとセットerrnoします。 渡すことによって、contextパラメーター、比較関数オブジェクト ポインターを使用できます、要素ポインターでオブジェクトの機能またはアクセスできません。 その他の情報にアクセスします。 追加、contextパラメーターにより、qsort_sためより安全なcontext共有情報を使用できるようにする静的変数を使用して、再入のバグを回避するために使用できる、compare関数です。

ルーチン必須ヘッダー
qsort_s<stdlib.h> および <search.h>

互換性の詳細については、「C ランタイム ライブラリ」の「 互換性 」を参照してください。

ライブラリ:のすべてのバージョン、 CRT ライブラリの機能です。

次の例では、使用して、context内のパラメーター、qsort_s関数です。 contextパラメーターでは、簡単にスレッド セーフな並べ替えを実行します。 確実にスレッド セーフで同期する必要のある静的変数を使用する代わりに渡す別contextソートごとにします。 この例では、ロケール オブジェクトとして使用される、contextパラメーター。

// 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);  
  
}  

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  

並べ替え

並べ替えと検索
bsearch_s
_lsearch_s
qsort

表示: