2010-02-13 1 views
2

Мне нужно реализовать qsort в C и отсортировать в обратном лексикографическом порядке. Я смущен тем, как создавать и вызывать функцию сравнения. Это то, что я до сих пор ..как реализовать qsort в C

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

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

Eclipse, говорит мне «„своего рода“Необъявленная (первое использование в этой функции)» на QSort линии, но я боюсь, что это не единственная моя проблема. Любой совет?

Спасибо, Христо

Revision ... это то, что мой массив выглядит следующим образом:

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

Если вы хотите отменить заказ, не используйте -1 раз сравнение; просто замените строки 'str1' и' str2' в вызове 'strcasecmp'. (По теме: Умножение на -1 является серьезным моментом, несмотря ни на что. Это то, что унарное отрицание.) –

+0

Другими словами: Best: 'strcasecmp (str2, str1)'. Хорошо: '-strcasecmp (str1, str2)'. Lousy: '-1 * strcasecmp (str1, str2)'. –

+0

haha ​​... спасибо за совет. Я все еще студент и учился, когда я иду. Я обязательно буду помнить об этом :) – Hristo

ответ

6

вы должны объявить своего рода перед использованием:

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

то сравнение может быть:

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

Как @Chris Jester-Young указывает, что вы можете поменять арфы, чтобы изменить сравнение.

указатели должны быть разыменовываются ...

+0

вправо! Я забыл поместить его в заголовок. Спасибо – Hristo

+2

@Robert: Указатели должны быть разыменованы, так как 'qsort' вызывает функцию сравнения с указателями на элементы массива, поэтому в этом случае указатели на' char * '. – sth

+2

'qsort' вызывает функцию сравнения с указателями на два элемента отсортированного массива. Элементами в этом случае являются 'char *', поэтому функция сравнения вызывается с указателями на 'char *' - поэтому 'char **' является правильным. – caf