簡體   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