繁体   English   中英

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

[英]Sort strings by length in C

我知道还有其他类似问题,但由于这个问题,它们无法正常工作。

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

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM