【问题标题】:Sort strings by length in C在C中按长度对字符串进行排序
【发布时间】:2017-02-28 21:44:16
【问题描述】:

我知道还有其他类似的问题,但它们不起作用,因此提出了这个问题。

我正在尝试按字符串的长度(降序)对字符串数组进行排序,并且我一直在尝试使用qsort,因为这是建议的,但每个解决方案都不适用于我。我相信原因是因为在所有使用qsort 的示例中,它们都有一个这样的数组;

char *arrayOfStrings...

但是我的数组是这样开始的

char **arrayOfStrings;

这是因为我将字符串动态添加到数组中,但无论哪种方式,我似乎都无法让 qsort 按顺序对字符串进行排序。

参考代码:

int numberOfStrings = 0;
int numberOfStringsTwo = 0;
int totalNoStrings = 0;

scanf("%d", &numberOfStrings);
totalNoStrings += numberOfStrings;
char **inputArray = malloc(numberOfStrings * sizeof(char*));
for (int i = 0; i < numberOfStrings; i++) {
    char input[100];
    scanf("%s", input);
    inputArray[i] = (char *)malloc((strlen(input) + 1));
    strcpy(inputArray[i], input);
}

scanf("%d", &numberOfStringsTwo);
totalNoStrings += numberOfStringsTwo;
inputArray = realloc(inputArray, totalNoStrings * sizeof(char*));
for (int j = numberOfStrings; j < totalNoStrings; j++) {
    char input[100];
    scanf("%s", input);
    inputArray[j] = (char *)malloc((strlen(input) + 1));
    strcpy(inputArray[j], input);
}

qsort(inputArray, totalNoStrings, sizeof(char *), compareStrings);

size_t z;
for (z = 0; z < totalNoStrings; z++) {
    printf("%s\n", inputArray[z]);
}

int compareStrings(const void *one, const void *two) {
    const char *iOne = (const char*)one;
    const char *iTwo = (const char*)two;
    return strcmp(iOne, iTwo);
}

【问题讨论】:

  • 上面的代码有什么问题?你的测试数据是什么样的,你期望什么结果,你得到什么结果? “这是我的代码,为我调试”并没有得到你太多的同情。
  • 您的compareStrings 函数不会根据长度进行比较。它比较字符串。另外,您是否在调试器中单步执行了此操作?
  • “它不起作用”是什么意思?它不编译吗?输入时会崩溃吗?它会给出不正确的输出吗?你必须给我们的不仅仅是“它不起作用”。我们在这里帮助您找到并解决问题,而不是为您考虑所有问题。
  • 如果您想根据“长度”进行排序,那么为什么 compareStrings 会调用 strcmp?您应该根据它们的长度进行比较,即 strlen(iOne)
  • @KyloR 一个很好的例子,说明为什么了解编写的代码在使用之前是如何工作的。并不意味着你什么都知道,但至少知道它做什么。幸运的是,在这种情况下,这是一个简单的修复。

标签: c arrays sorting qsort


【解决方案1】:

compareStringLens() 函数不正确:它接收指向字符串指针的指针,您在代码中错过了一级间接,在指针地址上调用 strlen 具有未定义的行为。

这是一个比较函数,它按长度递减和每个长度的字典顺序对字符串进行排序:

int compareStrings(const void *one, const void *two) {
    const char *iOne = *(const char * const *)one;
    const char *iTwo = *(const char * const *)two;
    size_t len1 = strlen(iOne);
    size_t len2 = strlen(iTwo);
    if (len1 > len2)
        return -1;
    if (len2 > len1)
        return +1;
    return strcmp(iOne, iTwo);
}

【讨论】:

  • 注意:如果严格要求长度作为比较(降序)并且无论内容如何都被视为相等的长度,则最后五行可以简单地为return (len1 &gt; len2) ? -1 : (len2 &gt; len1);。无论如何,很好的答案。
  • @WhozCraig:我同意比较函数比严格要求的更精确,但实现总顺序通常是一件好事,这样行为是可重现的。
  • 有人能解释一下*(const char * const *) one 中的投射是如何工作的吗? 真的不明白(
猜你喜欢
  • 2015-01-16
  • 1970-01-01
  • 2018-04-16
  • 2012-12-24
  • 2015-10-16
  • 2011-11-26
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
相关资源
最近更新 更多