2013-08-14 2 views
1

Я пытаюсь использовать qsort для сортировки строки символов по алфавиту. На данный момент это просто похоже на изменение порядка моей строки.qsort, меняющий порядок строк

printf("unsorted %s\n", string); 
qsort(string, strlen(string), sizeof(char), compare); 
printf("sorted %s\n", string); 

Строка - это строка "ACBD". Второй printf показывает это как «DBCA». Моя функция сравнения:

compare(const void *a1, const void *b1){ 
    const int *a2 = a1; 
    const int *b2 = b1; 

    if(*a2 == *b2){ 
     return 0; 
    } 
    else{ 
     if(*a2 < *b2){ 
      return -1; 
     } 
     else{ 
      return 1; 
     } 
    } 
} 

Я уверен, что я делаю что-то довольно глупо, но любая помощь приветствуется.

Edit: строка объявляется char string[1000]

ответ

4

Вы хотите сделать сравнение символов, но на самом деле делает целое сравнение (SizeOf Int> SizeOf символов).

Fix это следующим образом:

char *a2 = a1; 
char *b2 = b1; 
+0

спасибо! все исправлено сейчас – user2655377

+0

@ user2655377 FYI вам может быть лучше определить функцию сравнения как 'int cmp (const void * a1, const void * b1) {return * (char *) a1 - * (char *) b1; } ' – SheetJS

+0

Рассмотрите возможность разыменования указателей напрямую:' const char c1 = * (const char *) a1, c2 = * (const char *) b1; ', что делает остальную часть кода более простой. Как всегда, сравнение может быть упрощено для 'return (c1 c2; '. – unwind

Смежные вопросы