2015-01-24 5 views
0

Я пытаюсь сортировать строковый массив в алфавитном порядке, используя qsort.О qsort в C для строкового массива

Когда я использую comp1, который отдает аргументы char**, он работает хорошо.
Но нет, если я использую comp2, который вместо char*.

Почему? Я не могу понять разницу между comp1 и comp2.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int comp1(const void *a, const void *b) { 
    const char **pa = (const char **)a; 
    const char **pb = (const char **)b; 
    return strcmp(*pa, *pb); 
} 
int comp2(const void *a, const void *b) { 
    const char *pa = (const char *)a; 
    const char *pb = (const char *)b; 
    return strcmp(pa, pb); 
} 
void main(void) { 
    char *array[] = {"c","b","a"}; 
    int size = sizeof(array)/sizeof(char *); 
    int i; 
    qsort(array,size,sizeof(char *),compX); 
    //compX is comp1 or comp2 
    for(i=0;i<size;i++){ 
     printf("%s",array[i]); 
    } 
} 

выходов

а ← когда я использую COMP1

CBA ← когда я использую comp2

+0

В отличие от него, это 'int main 'И явные приведения от' void *' к некоторому другому указателю-указателю не нужны и не должны выполняться в C. Также избегайте передачи типа 'sizeof' вместо выражения, которое подвержено ошибкам. – Deduplicator

ответ

1

Вашего массив представляет собой массив указателей на строки.
Поскольку функция-компаратор всегда получает указатели на начало отсортированных элементов, это означает, что он получает void*, который указывает наchar* на эти строки.

Литье этих void* в char*, очевидно, одно направление слишком мало.

+0

О, я понял! Char * 's pointer is char **. Спасибо! – prog