Share via


qsort_s

Führt eine schnelle Sortierung aus.Eine Version von qsort mit unter Security Enhancements, wie in Sicherheitsfeatures im CRTbeschrieben.

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

Parameter

  • base
    Anfang des Zielarrays.

  • num
    Arraygröße in Elementen.

  • width
    Elementgröße in Bytes.

  • compare
    Vergleichsfunktion.Das erste Argument ist der context Zeiger.Das zweite Argument ist ein Zeiger auf key für die Suche.Das dritte Argument ist ein Zeiger auf den mit keyArrayelement verglichen werden soll.

  • context
    Ein Zeiger auf einen Kontext, der ein beliebiges Objekt sein kann, das die compare Routine zugreifen muss.

Hinweise

Die qsort_s-Funktion implementiert einen Quick SORT-Algorithmus zur Sortierung der einzelnen Elemente num ein Array von width Bytes.Das Argument base ist ein Zeiger auf der Basis des zu sortierenden Arrays.qsort_s überschreibt dieses Array mit den sortierten Elementen.Das Argument compare ist ein Zeiger auf eine benutzerdefinierte Routine, die zwei Arrayelemente vergleicht und einen Wert zurückgibt, der die ihre Beziehung angibt.qsort_s ruft die Routine compare einmal oder mehrmals während der Sortierung auf und übergibt Zeiger auf zwei Arrayelementen bei jedem Aufruf:

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

Die Routine muss die Elemente vergleichen und dann einen der folgenden Werte zurückgeben:

Rückgabewert

Beschreibung

< 0

elem1 kleiner als elem2

0

elem1 Äquivalent zu elem2

> 0

elem1 größer als elem2

Das Array wird in zunehmender Reihenfolge sortiert, wie von der Vergleichsfunktion definiert.Um in absteigender Reihenfolge zu sortieren. B. ein Array, kehren Sie den Sinn größerem „als“ und „kleiner als“ in der Vergleichsfunktion.

Wenn ungültige Parameter an die Funktion übergeben werden, wird der Ereignishandler aufgerufen, z. B. ungültige Parameter in Parametervalidierungbeschrieben.Wenn die Ausführung zulässig ist, um fortzufahren, kehrt die Funktion zurück und errno wird auf EINVALfestgelegt.Weitere Informationen finden Sie unter errno, _doserrno, _sys_errlist und _sys_nerr.

Fehlerbedingungen

Schlüssel

base

compare

num

width

errno

NULL

alle

alle

alle

alle

EINVAL

alle

NULL

alle

!= 0

alle

EINVAL

alle

alle

alle

alle

<= 0

EINVAL

alle

alle

NULL

alle

alle

EINVAL

qsort_sdas gleiche Verhalten wie qsort hat jedoch den context-Parameter und errnolegt diesen fest.Indem sie einen Parameter übergeben context Vergleichsfunktionen können einen Objektzeiger verwenden, um die Funktionen Objekt oder andere Informationen zugreifen, die durch einen Elementzeiger nicht zugreifen kann.Die Einführung des context-Parameters ist sicherer, da qsort_scontext verwendet werden kann, um die Reentranz zu vermeiden, die mithilfe von statischen Variablen, um freigegebene Informationen zur compare-Funktion auszuführen.

Anforderungen

Routine

Erforderlicher Header

qsort_s

<stdlib.h> und <search.h>

Um Kompatibilität zusätzlichen Informationen finden Sie unter Kompatibilität in der Einführung.

Bibliotheken: Alle Versionen CRT-Bibliotheks-Funktionen.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie der context von Parametern in der Funktion qsort_sverwendet.Der Parameter context erleichtert die threadsichere Sortierungen auszuführen.Anstatt statische Variablen verwenden zu können, die synchronisiert werden müssen, um Threadsicherheit zu gewährleisten, können Sie einen anderen context-Parameter in jeder Sortierung.In diesem Beispiel wird ein context Gebietsschemaobjekt als Parameter verwendet.

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

  
  
}

Beispielausgabe

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

.NET Framework-Entsprechung

Sort

Siehe auch

Referenz

Suchen und Sortieren

bsearch_s

_lsearch_s

qsort