2016-08-14 97 views
1

我有排序3d字符串數組的代碼示例。C - 按特定列對3d字符串數組進行排序

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

static char * rand_string(size_t ssize) 
{ 
    char * str = malloc(sizeof(char) * ssize); 
    const char charset[] = "abcdefghijklmnopqrstuvwxyz"; 
    if (ssize) { 
     --ssize; 
     for (size_t n = 0; n < ssize; n++) { 
      int key = rand() % (int) (sizeof charset - 1); 
      str[n] = charset[key]; 
     } 
     str[ssize] = '\0'; 
    } 
    return str; 
} 

char *** init_array(char *** array, int n_rows, int n_cols, int ssize) 
{ 
    int i, j; 
    array = malloc(n_rows * sizeof(char **)); 
    for (i = 0; i < n_rows; i++) 
    { 
     array[i] = malloc(n_cols * sizeof(char *)); 
     for (j = 0; j < n_cols; j++) 
      array[i][j] = malloc(ssize * sizeof(char)); 
    } 
    return array; 
} 

void gen_array(char *** array, int n_rows, int n_cols, int ssize) 
{ 
    int i, j, k; 
    for (i = 0; i < n_rows; i++) 
     for (j = 0; j < n_cols; j++) 
      snprintf(array[i][j], ssize, "%s", rand_string(ssize)); 
} 

int str_compare(const void * a, const void * b) 
{ 
    const char *pa = **(const char ***) a; 
    const char *pb = **(const char ***) b; 

// printf("debug: a = %s\n", **(const char ***) a); 
    return strcmp(pa, pb); 
} 

void print_array(char *** array, int n_rows, int n_cols) 
{ 
    int i, j; 
    for (i = 0; i < n_rows; i++) { 
     for (j = 0; j < n_cols; j++) 
      printf("%s ", array[i][j]); 
     printf("\n"); 
    } 
} 

int main(void) 
{ 
    int n_rows = 3, n_cols = 5, ssize = 10; 
    char *** z; 

    z = init_array(z, n_rows, n_cols, ssize); 
    gen_array(z, n_rows, n_cols, ssize); 
    print_array(z, n_rows, n_cols); 
    printf("\n"); 
    qsort(z, 3, sizeof(char *), str_compare); 
    print_array(z, n_rows, n_cols); 

    return 0; 
} 

與下面的輸出,在哪裏起源陣列和排序的數組(這些示例值和隨機性無所謂):

nwlrbbmqb hcdarzowk kyhiddqsc dxrjmowfr xsjybldbe 
fsarcbyne cdyggxxpk lorellnmp apqfwkhop kmcoqhnwn 
kuewhsqmg bbuqcljji vswmdkqtb xixmvtrrb ljptnsnfw 

fsarcbyne cdyggxxpk lorellnmp apqfwkhop kmcoqhnwn 
kuewhsqmg bbuqcljji vswmdkqtb xixmvtrrb ljptnsnfw 
nwlrbbmqb hcdarzowk kyhiddqsc dxrjmowfr xsjybldbe 

我正在尋找一種方式被另一列進行排序(第二或第三)。可能嗎?

感謝。

回答

0

你可以利用這個排序功能沿其第二列的矩陣排序:

int str_compare2(const void * a, const void * b) { 
    const char *pa = ((const char ***)a)[0][1]; 
    const char *pb = ((const char ***)b)[0][1]; 

    return strcmp(pa, pb); 
} 

更改12將沿第三列排序等

請注意,您應該調用qsort這方式:

qsort(z, 3, sizeof(char **), str_compare); 

z是陣列,而不是char *。在大多數體系結構中,sizeof(char*) == sizeof(char **),因此沒有區別,但爲了保持一致性和可讀性,建議使用正確的類型。

+0

太棒了!感謝您快速回答! – lesovsky

相關問題