2010-02-13 5 views
2

C에서 qsort를 구현하고 역 사전 식 순서로 정렬해야합니다. 비교 함수를 만들고 호출하는 방법에 대해 혼란스러워합니다. 이C에서 qsort를 구현하는 방법

qsort (strArr, numLines, sizeof(char*) , sort); 

int sort(const void * str1, const void * str2) { 
return (-1) * strcasecmp((char*) str1, (char*) str2); 
}; 

이클립스 나를 말하는 qsort가 줄에 " '일종의'선언되지 않은 (이 기능에서 처음 사용)"입니다 .. 내가 지금까지 가지고있는,하지만 난 그게 내 유일한 문제는 아니다 우려하고있다. 어떤 충고?

char **strArr = malloc(numLines * sizeof(char*)); 
fgets(output, 256, sourceFile); 
strArr[i] = malloc(((int) strlen(output) + 1) * sizeof(char)); 
strcpy(strArr[i],output); 
+0

순서를 반대로하려면 비교를 사용하지 마십시오. 그냥'str1'과'str2'를'strcasecmp' 호출에서 바꿔 치기 만하면됩니다. (관련 주제에 관해서는 -1로 곱셈을하는 것은 내 것이고, 어떤 것이 든 상관이 없습니다.) –

+0

다른 말로 : 최상 :'strcasecmp (str2, str1)'. 좋아요 :'-strcasecmp (str1, str2)'. Lousy :'-1 * strcasecmp (str1, str2)'. –

+0

하하 ... 충고에 감사드립니다. 나는 여전히 학생이며 배우면서 배우고 있습니다. 나는 그것을 명심해야한다 :) – Hristo

답변

6

당신이 그것을 사용하기 전에 일종의 선언해야합니다 : 다음

int sort(const void * str1, const void * str2); 

감사합니다, 흐리 스토

개정 ...이 내 배열 모습입니다 비교는 다음과 같습니다.

return strcasecmp(*(char * const *)str2, *(char * const *)str1); 

@Chris Jester-Young이 지적했듯이 args를 바꿔 비교를 뒤바꿀 수 있습니다.

포인터를 참조 해제해야합니다 ...

+0

맞다! 나는 그것을 머리말에 넣는 것을 잊었다. 감사합니다. – Hristo

+2

@ 로버트 :'qsort'가 배열 요소에 대한 포인터로 비교 함수를 호출하기 때문에 포인터를 역 참조해야합니다.이 경우에는'char *'를 가리키는 포인터입니다. – sth

+2

'qsort'는 정렬되는 배열의 두 요소에 대한 포인터를 가지고 비교 함수를 호출합니다. 이 경우 요소는'char *'이므로, 비교 함수는'char *'에 대한 포인터로 호출되므로 -'char **'가 옳다. – caf

관련 문제