Сравнение строк в qsort - PullRequest
       15

Сравнение строк в qsort

0 голосов
/ 07 февраля 2019

Всякий раз, когда я сравниваю строку в qsort, порядок совершенно неправильный.Например, ввод

45 4 9 22 2

, но мой вывод

22 45 4 9 2

, вот моя функция сравнения

int cmpString(const void *a, const void *b) {
  const Node *a1 = *(const Node **)a;
  const Node *b1 = *(const Node **)b;

  return a1->s.c_str() - b1->s.c_str();
}

и не говорите мне использовать sort (), Я не могу для этого назначения

1 Ответ

0 голосов
/ 07 февраля 2019

Эта строка является основной проблемой вашего кода.

return a1->s.c_str() - b1->s.c_str();

Причина этого в том, что вы вычитаете два указателя здесь, а это не то, что компаратор должен делать в этом случае.Comparator выполняет сравнение на основе содержимого.

Вместо этого попробуйте следующее:

int length1 = a1->s.size();
int length2 = b1->s.size();

for (int i = 0; i < min(length1, length2); i++) {
    if (a1->s[i] != b1->s[i]) { // if characters are not same, return difference of their ASCII values.
        return a1->s[i] - b1->s[i];
    }
}

return length1 - length2; // if they are same till now, then shorter string should appear first. That's why it is required.

Предложение:

Если вы кодируете в C ++, тогда, пожалуйста, используйте STL.Есть хорошая функция sort(), заданная <algorithm>, которая позволяет вам делать то же самое без использования void *

Обновление:

Как справедливо предложено user4581301 , вы можете напрямую использовать std :: string :: Сравнение.

Например:

return (a1->s).compare(b1->s);
...