2013-12-01 4 views
0

Я пишу функцию сравнения, которая будет передана qsort, и у меня возникли проблемы с сортировкой строки по алфавиту.Сравнение строк в алфавитном порядке в C

typedef struct{ 
    char title[30]; 
    //other irrelevant variables 
} Album; 

compare(Album * l, Album * r){ 

    if(l->title > r->title){ 
     return -1; 
    } 
    if(l->title == r->title){ 
     return 0; 
    } 
    else{ 
     return 1; 
    } 
} 

qsort(albums, num_albums, sizeof(Album), compare); 

Я знаю, что это, вероятно, неправильно, но я не уверен, как сравнивать с указателями на символы в алфавитном порядке. Может кто-нибудь помочь этому старику?

ответ

6

Имя голого массива оценивается по адресу первого элемента массива. Вам нужно сравнить содержимое строки, а не строковые адреса. Там случается хорошая функция, чтобы сделать это — strcmp:

compare(Album * l, Album * r) { 
    return strcmp(l->title, r->title); 
} 
+0

такой простой, но эффективный. Благодаря :) – Zack

1

Во-первых, ваша compare функция не имеет возвращаемого типа. Предполагаю, что он должен вернуть int.

Если сравнить l->title и r->title с помощью > и == операторов, что на самом деле происходит то, что указатели на ячейки памяти сравниваются, а не фактические символы. Переменная l->title действительно является указателем на первый элемент массива (символа), который логически представляет l->title.

Вы ищете функцию strcmp (Google для нее или введите man strcmp в терминале * nix). Если вы хотите написать это с нуля, вам нужно будет написать функцию, которая сравнивает строки по одному символу за раз. Например, l->title[0] является первым символом этой строки, l->title[1] является вторым и т. Д.

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