Сравнение строк по алфавиту в C

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

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);

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


person Zack    schedule 01.12.2013    source источник


Ответы (2)


Простое имя массива оценивается как адрес первого элемента массива. Вам нужно сравнить содержимое строки, а не адреса строк. Для этого есть хорошая функцияstrcmp:

compare(Album * l, Album * r) {
    return strcmp(l->title, r->title);
}
person Ted Hopp    schedule 01.12.2013
comment
так просто, но эффективно. Спасибо :) - person Zack; 01.12.2013

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

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

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

person Andrey Mishchenko    schedule 01.12.2013