在C中按长度对字符串排序

在C中按长度对字符串排序,c,arrays,sorting,qsort,C,Arrays,Sorting,Qsort,我知道还有其他类似的问题,但它们不起作用,因此提出了这个问题 我正在尝试按字符串的长度(降序)对数组进行排序,并且我一直在尝试使用qsort,因为这是建议的,但每个解决方案都不适合我。我相信原因是因为在所有使用qsort的示例中,它们都有这样一个数组 char *arrayOfStrings... 但我的数组就是这样开始的 char **arrayOfStrings; 这是因为我正在动态地将字符串添加到数组中,但无论哪种方式,我似乎都无法让qsort按顺序对字符串进行排序 参考代码: int

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

我正在尝试按字符串的长度(降序)对数组进行排序,并且我一直在尝试使用
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]);
}

comparestinglens()
函数不正确:它接收指向字符串指针的指针,代码中缺少一级间接寻址,对指针地址调用
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);
}

comparestinglens()
函数不正确:它接收指向字符串指针的指针,代码中缺少一级间接寻址,对指针地址调用
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);
}

上面的代码有什么问题?你的测试数据是什么样子的,你期望得到什么结果,你得到什么结果?“这是我的代码,为我调试它”并没有得到你多少同情。你的
compareStrings
函数不会根据长度进行比较。它比较字符串。另外,您是否在调试器中单步执行了此操作?什么叫“它不工作”?它不编译吗?它会在输入时崩溃吗?它是否给出了不正确的输出?你必须给我们的不仅仅是“它不起作用”。我们在这里是为了帮助你发现并解决问题,而不是为你做所有的思考。如果你想根据“长度”进行排序,那么为什么compareStrings会调用strcmp?您应该根据它们的长度进行比较,即strlen(iOne)compareStrings函数不会根据长度进行比较。它比较字符串。另外,您是否在调试器中单步执行了此操作?什么叫“它不工作”?它不编译吗?它会在输入时崩溃吗?它是否给出了不正确的输出?你必须给我们的不仅仅是“它不起作用”。我们在这里是为了帮助你发现并解决问题,而不是为你做所有的思考。如果你想根据“长度”进行排序,那么为什么compareStrings会调用strcmp?您应该根据它们的长度进行比较,即strlen(iOne)return(len1>len2)-1:(len2>len1)。不管怎样,回答很好。@WhozCraig:我同意比较函数比严格要求的更精确,但通常实现总顺序是一件好事,这样行为才是可复制的。注意:如果严格要求长度作为比较(降序),那么不管内容如何,等长都被认为是等效的,最后五行可以是
return(len1>len2)-1:(len2>len1)。不管怎样,答案很好。@WhozCraig:我同意比较函数比严格要求的更精确,但是实现一个总的顺序通常是一件好事,这样行为是可复制的。