Сортировать массив строк по длине строки в C - PullRequest
0 голосов
/ 29 августа 2018

У меня есть массив строк в C. Эти строки хранят пути файловых систем, которые должны быть размонтированы.

For example...
mountlist[0] = "/proc"
mountlist[1] = "/dev"
mountlist[2] = "/dev/shm"
and so on...

Мне нужно размонтировать вложенные файловые системы перед файловыми системами, над которыми они смонтированы (поэтому /dev/shm необходимо размонтировать перед /dev). Я думал, что самый простой способ сделать это - отсортировать строки по длине, сначала по длине. У меня есть количество строк в массиве, хранящихся в целом числе i.

С кодом, который я смог придумать до сих пор, учитывая, что strnum является целым числом строки, к которой мне нужно получить доступ, строки доступны с mountlist[strnum] и соответствующая длина сохраняется в length[strnum].

В заключение, как я могу отсортировать строки в массиве по наибольшей длине? Мне не нужно на самом деле сортировать строки, мне просто нужно получить доступ к ним в правильном порядке. Я не могу понять, как это написать, но я думал о коде, который создает массив int с номером каждого массива строк в правильном порядке (пример выше будет {2, 0, 1}), так что если этот массив был назван sort, тогда mountlist[sort[0]] будет самой длинной строкой. С таким массивом соответствующий цикл for будет:

for (int q = 0; q < i; q++) {
    umount(mountlist[sort[q]]);
}

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Если вы не хотите зависеть от чего-либо «внешнего», такого как qsort, которое может или не может быть доступно в вашей среде, это должно сделать это:

for (int j = 0; j < i; ++j) sort[j] = j;

for (int j = 0; j < i - 1; ++j) {
    int longest = j;
    for (int k = j + 1; k < i; ++k) {
        if (length[sort[k]] > length[sort[longest]]) longest = k;
    }
    int tmp = sort[longest];
    sort[longest] = sort[j];
    sort[j] = tmp;
}
0 голосов
/ 29 августа 2018

Вы можете просто использовать qsort с пользовательским компаратором:

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

int cmp(const void *first, const void *second) { 
    const char **firstCast = (const char ** )first;
    const char **secondCast = (const char **) second;
    return strcmp(*secondCast, *firstCast);
}
int main(void) {
    const char *a[3];
    a[0] = "longest";
    a[1] = "short";
    a[2] = "medium";
    qsort(a, 3, sizeof(char *), cmp);
    for (int i = 0 ; i < 3; i++) {
        printf("%s\n", a[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...