Как qsort директ в C - PullRequest
       49

Как qsort директ в C

0 голосов
/ 18 марта 2019

Совершенно новый для C и найти его запутанным. Что я действительно хочу знать, так это взять два отдельных фрагмента кода и заставить их работать вместе.


Вот некоторый код, который просто перечисляет содержимое текущего каталога:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

int
main (void)
{
  DIR *dp;
  struct dirent *ep;

  dp = opendir ("./");
  if (dp != NULL)
    {
      while (ep = readdir (dp))
        puts (ep->d_name);
      (void) closedir (dp);
    }
  else
    perror ("Couldn't open the directory");

  return 0;
}

Вывод не отсортирован


Вот некоторый код, который сортирует массив по длине элементов, используя алгоритм быстрой сортировки:

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

char *array[] = { "XX", "YYY", "Z" };
#define N (sizeof(array) / sizeof(array[0]))

int
cmp(const void *a, const void *b)
{
    size_t lena = strlen(*(const char **)a);
    size_t lenb = strlen(*(const char **)b);
    return lena < lenb ? -1 : lena > lenb;
}

int
main()
{
    size_t i;
    qsort(array, N, sizeof(array[0]), cmp);
    for (i =  0; i < N; i++)
        printf("%s\n", array[i]);
}

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

1 Ответ

0 голосов
/ 19 марта 2019

Вы можете хранить объекты dirent внутри массива, который затем можете передать в qsort. Функция cmp должна быть модифицирована для сравнения элемента d_name внутри указателей dirent. вот так

int cmp(const *a, const void *b)
{
  size_t lena = strlen(((struct dirent *) a)->d_name);
  size_t lenb = strlen(((struct dirent *) b)->d_name);
  return lena < lenb ? -1 : lena > lenb;
}
...