2016-08-14 2 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; 
} 

(두 번째 또는 세 번째). 가능한가?

감사합니다.

당신이 정렬 기능과의 두 번째 열에 따라 행렬 정렬 할 수 있습니다

답변

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이 세 번째 열에 따라 정렬합니다 변경을 등이 qsort이를 호출해야

주 방법 :

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

z은의 배열, 아니 char *. 대부분의 아키텍처에서는 sizeof(char*) == sizeof(char **)이므로 차이점은 없지만 일관성과 가독성을 위해 올바른 유형을 사용하는 것이 좋습니다.

+0

좋아요! 빠른 답변 주셔서 감사합니다! – lesovsky