У вас наверняка возникнут проблемы
, преобразовывающие const void *
в const char *
для сравнения строк.
, поскольку сортируемый вами массив (argv
) - это массив char*
, а не массив char
.А функция сравнения, используемая qsort
, снабжена указателями на сортируемые объекты, а не на сами объекты.[Примечание 1]
Таким образом, если бы ваша функция сравнения получала char *
(приведение к void *
), вы бы сравнивали символы.Так как вы на самом деле сравниваете строки символов - то есть массивы символов - вы должны ожидать char**
(приведение к void*
).
Один довольно уродливый способ обработки, который будет:
> a_char = tolower(((char**) a)[i]);
Но я предпочитаю приводить аргументы один раз в верхней части функции:
int my_compare(void* va, void* vb) {
char** a = va;
char** b = vb;
/* ... */
}
Я не делаю этого для эффективности;он, вероятно, производит тот же код.Я делаю это потому, что мне легче читать.
Заметки
- C не может передать объект неизвестного типа по значению.Но вы можете передать указатель объекту неизвестного типа, приведя указатель к
void*
, при условии, что вызываемая функция имеет способ узнать, каким был исходный тип указателя.