2016-08-14 8 views
1

3D文字列配列をソートするコード例があります。C - 特定の列による3D文字列の並べ替え

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 

私は別の列でソートする方法を探しています:起源の配列とソートされた配列(これらは例の値であり、ランダム性は重要ではありません)されている次の出力、と

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

(2番目または3番目)。出来ますか?

ありがとうございました。

答えて

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

21を変更すると、3番目の列に沿って並べ替えられます、などあなたがqsortこのメソッドを呼び出す必要があります

注意方法:

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

zはの配列です、char *ではありません。ほとんどのアーキテクチャではsizeof(char*) == sizeof(char **)なので違いはありませんが、一貫性と可読性のために正しいタイプを使用することをお勧めします。

+0

素晴らしい!すぐにお返事ありがとうございます! – lesovsky

関連する問題