2016-08-14 89 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

相关问题