【问题标题】:Sort String Array by String Length in C在C中按字符串长度对字符串数组进行排序
【发布时间】:2018-08-29 13:50:51
【问题描述】:

我在 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]]);
}

【问题讨论】:

  • 你知道qsort()吗?
  • @Fureeish 不,我会查一下。
  • 如果订单是基于长度的,它可能会失败。示例:如果您有"/dev/shm""/somenonnested",则后者将在"/dev/shm" 之前卸载,因为它的长度更长...
  • "/path" 在字典上总是小于"/path/contained",其中/path 是一个目录,contained 是该目录中的某个内容。所以没有必要按字符串长度排序 - 以反向字典顺序排序就足够了

标签: c arrays string


【解决方案1】:

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

【讨论】:

  • 他希望根据字符串长度进行排序(顺便说一句,这可能不是正确的选择,请参阅我对问题的评论),而不是基于字符串比较。
【解决方案2】:

如果您不想依赖任何“外部”(例如 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;
}

【讨论】:

  • qsort 包含在C standard 中,因此毫无疑问它是可用的。
猜你喜欢
  • 2015-01-16
  • 2016-04-23
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2018-03-24
  • 2013-12-03
  • 2012-12-24
相关资源
最近更新 更多