Существует как минимум два способа исправить код сортировки. Один из них - изменить функцию сравнения, чтобы она соответствовала вызову qsort (); другой - исправить вызов qsort () для сопоставления с компаратором. Правильное исправление зависит от определения массива, но самое простое объявление - это массив структур (а не указателей структур). Следовательно, этот рабочий код - который использует оригинальный компаратор, но другой вызов qsort ():
#include <stdlib.h>
#include <stdio.h>
typedef struct {
char *ip;
} mystruct;
static mystruct a_struct[] =
{
"66.249.71.3",
"190.148.164.245",
"207.46.232.182",
"190.148.164.245",
"190.148.164.245",
"202.154.114.253",
"190.148.164.245",
"190.148.164.245",
"66.249.71.3",
"190.148.164.245",
"202.154.114.253",
};
/* qsort */
static int struct_cmp(const void *a, const void *b)
{
mystruct *ia = (mystruct *)a;
mystruct *ib = (mystruct *)b;
return strcmp(ia->ip, ib->ip);
}
static void print_list(mystruct *list, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%2d: %s\n", i, list[i].ip);
}
#define DIM(x) (sizeof(x)/sizeof(*(x)))
int main(void)
{
print_list(a_struct, DIM(a_struct));
qsort(a_struct, DIM(a_struct), sizeof(mystruct), struct_cmp);
print_list(a_struct, DIM(a_struct));
}
Это просто оставляет нам отсортированный по буквам и цифрам массив значений со всеми адресами «190.xyz», появляющимися перед остальными, и т. Д. Исправление, которое требует более сложного компаратора - одно решение, для которого Стивеха в своем ответе .