2013-11-21 2 views
1

비교 : qsort가 나의 비교 기능은 다음과 같습니다를 qsort : 나는이 질문에 다음과 같은 한 문자열

static int compare(const void *arg1, const void *arg2) { 
    return strcmp((const char *) arg1, (const char *) arg2); 
} 

이 작동하지 않았다, 그래서 나는 그 사람 페이지에서 코드 예제를 보면서 나는 변경 그것은 조금, 그래서 지금은 다음과 같습니다 : 맨 페이지의 방법이 왜 작동을 strcmp 매개 변수가 const를 숯불 *의 S1과 CONST의 char * s2를하기 때문에

static int compare(const void *arg1, const void *arg2) { 
    return strcmp(*(char * const *) arg1, *(char * const *) arg2); 
} 

나는 그것을하지 않습니다.

저는 C에서 꽤 새롭기 때문에 이것을 이해하기 어렵습니다. 누군가 맨 페이지의 방법 만 작동하는 이유를 설명해 주시겠습니까?

+2

중복 된 항목을 찾으십시오. 이미 비슷한 질문이 많이 있습니다. 옵션에는 다음과 같은 장점이 있습니다 ([SO 14993282] (http://stackoverflow.com/questions/14993282/), [SO 5035289] (http://stackoverflow.com/questions/5035289/), [SO 18400333] (http://stackoverflow.com/questions/18400333/), [SO 19558447] (http://stackoverflow.com/questions/19558447/). 나는 다른 사람들도 있다고 확신한다. SO 검색 창에서'[c] qsort string'으로 검색해보십시오. –

답변

3

질문에 대한 간결한 대답은 char *이 아니고 char ** 인 포인터가 비교 함수에 전달된다는 것입니다.

정수 배열을 정렬하는 경우 int * 값 (void *으로 가장합니다)이 전달됩니다. double 배열을 정렬하는 경우 두 개의 double * 값이 전달됩니다. 문자열 배열을 정렬하는 경우 문자열에 두 개의 포인터가 전달되므로 두 개의 char ** 값을 의미합니다.

+2

정확한 해결책 – Abhineet

+0

정말 간결하고 정확합니다. – haccks

3

man qsort 말한다 : 배열

내용이 비교되는 객체를 가리 개의 인자로 호출 가 compar 가리키는 비교 함수에 따라 오름차순으로 정렬된다.

"비교할 개체를 가리키는 두 개의 인수가 있습니다"라는 것이 분명합니다. 프로토 타입이라고

static int 
    cmpstringp(const void *p1, const void *p2) 
    { 
     /* The actual arguments to this function are "pointers to 
      pointers to char", but strcmp(3) arguments are "pointers 
      to char", hence the following cast plus dereference */ 

     return strcmp(* (char * const *) p1, * (char * const *) p2); 
    } 

그리고 man strcmp가 당신을 말할 것이다 :이 char * 문자열을 비교할 때, 인수는 맨 페이지에서 설명하고있다 "char에 대한 포인터 포인터"유형에

int strcmp(const char *s1, const char *s2); 

인수는 "char에 대한 포인터"입니다.

따라서 변환으로이를 해결합니다.

맨 페이지를주의 깊게 읽어야 할 수도 있습니다.