按C中的字符串长度对字符串数组进行排序

时间:2018-08-29 13:50:51

标签: c arrays string

我在C中有一个字符串数组。这些字符串存储需要卸载的文件系统的路径。

@Bean
public Step personLoadingStep() {
    return steps.get("personLoadingStep")
            .tasklet((contribution, chunkContext) -> {
                System.out.println("personLoadingStep");
                chunkContext.getStepContext().getStepExecution().setExitStatus(new ExitStatus("INVALID"));
                return RepeatStatus.FINISHED;
            })
            .build();
}

我需要先将嵌套的文件系统挂载到挂载的文件系统上(因此For example... mountlist[0] = "/proc" mountlist[1] = "/dev" mountlist[2] = "/dev/shm" and so on... 需要先于/dev/shm挂载)。我在想,最简单的方法是按长度对字符串进行排序,最长的优先。我将数组中的字符串数存储在整数/dev中。

使用到目前为止我已经提出的代码,假设i是我需要访问的字符串的整数,则可以使用strnum及其对应的字符串访问这些字符串长度存储在mountlist[strnum]中。

总而言之,如何按最大到最小长度对数组中的字符串排序?我不需要对字符串进行实际排序,只需要按正确的顺序访问它们即可。我不知道该怎么写,但是我在想代码创建一个int数组,并以正确的顺序排列每个字符串数组的编号(上面的示例为{2,0,1}),所以如果该数组的名称为length[strnum],则sort将是最长的字符串。使用这样的数组,对应的mountlist[sort[0]]循环将是:

for

2 个答案:

答案 0 :(得分:3)

您可以仅将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]);
    }
}

答案 1 :(得分:1)

如果您不希望依赖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;
}