qsort_s
빠른 정렬을 수행합니다.버전 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 포인터입니다.두 번째 인수에 대 한 포인터입니다 있는 key 검색 합니다.세 번째 인수 배열 요소를 비교 하는 포인터입니다 key.context
개체 컨텍스트 수 있습니다에 대 한 포인터를 compare 루틴을 필요에 액세스할 수 있습니다.
설명
qsort_s 기능 배열을 정렬 하려면 퀵 정렬 알고리즘을 구현 num 의 각 요소를 width 바이트입니다.인수가 base 의 배열 정렬 되는 것에 대 한 포인터입니다.qsort_s이 배열을 정렬 된 요소를 덮어씁니다.인수가 compare 배열 요소 두 개를 비교 하 고 서로의 관계를 지정 하는 값을 반환 하는 사용자 제공 루틴에 대 한 포인터입니다.qsort_s호출의 compare 일상적인 여러 시간 동안 정렬에 각 호출에서 두 배열 요소에 포인터를 전달 합니다.
compare( context, (void *) & elem1, (void *) & elem2 );
루틴의 요소를 비교 하 고 다음 값 중 하나를 반환 해야:
반환 값 |
설명 |
---|---|
< 0 |
elem1보다 작은elem2 |
0 |
elem1해당 하는elem2 |
> 0 |
elem1보다 큼elem2 |
비교 함수에 의해 정의 된 배열은 오름차순으로 정렬.배열을 내림차순으로 정렬 하려면 ">" 및 "보다 작음" 비교 함수를 보면을 반대로 합니다.
잘못 된 매개 변수가 함수에 전달 된 경우 잘못 된 매개 변수 처리기를의 설명에 따라 호출 됩니다 매개 변수 유효성 검사.실행을 계속 하려면 허용 되지 않으면 해당 함수를 반환 하 고 errno 으로 설정 EINVAL.자세한 내용은 errno, _doserrno, _sys_errlist, _sys_nerr를 참조하십시오.
오류 조건
키 |
base |
compare |
num |
width |
errno |
---|---|---|---|---|---|
NULL |
모든 |
모든 |
모든 |
모든 |
EINVAL |
모든 |
NULL |
모든 |
!= 0 |
모든 |
EINVAL |
모든 |
모든 |
모든 |
모든 |
< = 0 |
EINVAL |
모든 |
모든 |
NULL |
모든 |
모든 |
EINVAL |
qsort_s같은 동작으로 qsort 하지만 context 매개 변수 및 세트 errno.전달 하 여는 context 매개 변수를 비교 함수 사용할 수 있는 개체 포인터 요소 포인터를 통해 개체 기능을 사용 하거나 액세스할 수 없습니다. 다른 정보에 액세스할 수 있습니다.추가 context 매개 변수를 만듭니다 qsort_s있기 때문에 보다 안전한 context 공유 정보를 사용할 수 있도록 정적 변수를 사용 하 여 도입 된 재진입 버그를 방지 하기 위해 사용할 수 있습니다에서 compare 함수.
요구 사항
루틴 |
필수 헤더 |
---|---|
qsort_s |
<stdlib.h> 및 <search.h> |
추가 호환성 정보를 참조 하십시오. 호환성 소개에서 합니다.
라이브러리: 의 모든 버전은 CRT 라이브러리 기능.
예제
다음 예제에서는 사용 하는 방법을 보여 줍니다 있는 context 매개 변수에 qsort_s함수.context 매개 변수를 사용 하면 쉽게 스레드로부터 안전한 정렬을 수행할 수 있습니다.스레드 안전을 위해 동기화 해야 하는 정적 변수를 사용 하는 대신 다른 전달 context 매개 변수에서 각 정렬 합니다.이 예제에서는 locale 개체 이름으로 사용 되는 있는 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