qsort without move

使用 qsort 排序字串陣列,輸出按字典排序方式輸出,但排列完成後,原始陣列內容不可改變

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define length  (sizeof(string) / sizeof(string[0]))

char string[][12] = { "Linux", "programming", "Embedded", "Android", "ittraining" };

static int cmpstringp(const void *p1, const void *p2)
{
    return strcmp(*(char * const *)p1, *(char * const *)p2);
}

int main()
{
    char* stringindex[length];
    int i;

    // copy pointer
    for (i=0; i<length; i++)
    {
        stringindex[i] = string[i];
    }

    qsort(stringindex, length, sizeof(stringindex[0]), cmpstringp);

    printf("\nSorted data:\n");

    for (i=0; i<length; i++)
    {
        printf("%d = %s\n", i, stringindex[i]);
    }

    printf("After qsort, origonal array:\n");

    for (i=0; i<length; i++)
    {
        printf("string[%d] = %s\n", i, string[i]);
    }

    exit(EXIT_SUCCESS);
}

在不改變原始陣列的條件下,只要把字串指標複製出來,然後拿來排序就可以了




改用 index 的方式

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define length  (sizeof(string) / sizeof(string[0]))

char string[][20] = { "Linux", "programming", "Embedded", "Android", "ittraining" };

// p1 & p2 is index of string
static int cmpstringp(const void *p1, const void *p2)
{
//    return strcmp(*(char * const *)p1, *(char * const *)p2);
    return strcmp(string[*(int*)p1], string[*(int*)p2]);
}

int main()
{
    //char* stringindex[length];
    int stringindex[length];
    int i;

    // create index
    for (i=0; i<length; i++)
    {
        stringindex[i] = i;
    }

    qsort(stringindex, length, sizeof(stringindex[0]), cmpstringp);

    printf("Sorted data:\n");

    for (i=0; i<length; i++)
    {
        printf("%d = %s\n", i, string[stringindex[i]]);
    }

    printf("\nAfter qsort, origonal array:\n");

    for (i=0; i<length; i++)
    {
        printf("string[%d] = %s\n", i, string[i]);
    }

    exit(EXIT_SUCCESS);
}

stringindex 改成只存放 string 的索引值,故在 cmpstringp 函式中要直接把 string 陣列拿來做比較

執行結果如下圖:

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯