Как отсортировать массив указателей в алфавитном порядке, а затем использовать qsort? - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь написать функцию, в которой я сортирую указатели внутри wptrs, массива указателей на строки в другом массиве. Я призываю себя не использовать string.h для этого упражнения, так как я хочу понять, как алгоритм сортировки может работать в C. Однако я использую qsort(), но я пытаюсь написать для него функцию сравнения с именем mycharptrcompare().

Я посмотрел, как работает strcmp(), и я попытался имитировать это с помощью mycharptrcompare(). Однако я заметил разницу в том, что strcmp() ожидает символ *, а функция mycharptrcompare() ожидает символ **. Я написал метод под названием dumpwptrs, чтобы показать мне содержимое и то, как они организованы в wptrs. Пока у меня есть следующий код:

UPDATE

Я также пробовал:

int mycharptrcompare(const void *a, const void *b)
{
  //Need to convert a void * to a more specific type to dereference
  const char *aPtr = a;
  const char *bPtr = b;
  const char **pa = &aPtr;
  const char **pb = &bPtr;

  while (*pa && *pa == *pb) {
    pa++;
    pb++;
  }
  return *pa - *pb;
}

и мой вывод был:

(нуль)

перескакивает

мир

есть

собака

синий

Что по-прежнему неверно, поскольку мой список должен быть отсортирован в алфавитном порядке, а первый ввод (слово «привет») не был прочитан.

1 Ответ

1 голос
/ 23 июня 2019

К вашему сведению пример использования qsort().

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

int cmp(const void *a, const void *b)
{
    const char **pa = a;
    const char **pb = b;
    return strcmp(*pa, *pb);
}

int main(void)
{
    char *wptrs[] = { "hello", "jumps", "world", "is", "dog", "blue" };
    size_t len = sizeof wptrs / sizeof wptrs[0];
    qsort(wptrs, len, sizeof wptrs[0], cmp);

    for(size_t i = 0; i < len; i++) {
        printf("%s\n", wptrs[i]);
    }
    return 0;
}

Вывод программы:

blue
dog
hello
is
jumps
world
...