2013-11-28 3 views
0

qsort()의 문자로 3D 배열을 정렬하는 데 문제가 있습니다. 문자열의 길이로 배열을 정렬하려고합니다. qsort에 의해 C에서 문자의 3D 배열을 정렬하는 방법

나는 2 차원 배열 정렬이 코드를 발견

int compare(const void *name1, const void *name2) 
{ 
    const char *name1_ = *(const char **)name1; 
    const char *name2_ = *(const char **)name2; 

    return strcmp(name1_, name2_); 
} 

을 그리고 나는 이것에 코드 수정 :

int compare(const void *name1, const void *name2) 
{  

    const char *name1_ = *(const char ***)name1; 
    const char *name2_ = *(const char ***)name2; 

    if(strlen(name1_)>strlen(name2_)) 
    { 
     return 1; 
    } 

    if(strlen(name1_)<strlen(name2_)) 
    { 
     return -1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

그러나이 작동하지 않습니다, 나는 방법을 몰라 해.

예를 들면. 나는이 같은 배열을 정렬 할 :

char * array1 [][2] = { 
    { "murderer", "termination specialist" }, 
    { "failure", "non-traditional success" }, 
    { "specialist", "person with certified level of knowledge" }, 
    { "incorrect answer", "alternative answer" } 
    }; 

이 형식에 : 당신이 소개하고 싶습니다 정렬 규칙을 모른 채

char * array1 [][2] = { 
     { "incorrect answer", "alternative answer" }, 
     { "specialist", "person with certified level of knowledge" }, 
     { "murderer", "termination specialist" }, 
     { "failure", "non-traditional success" } 
     }; 
+0

어떻게 작동하지 않습니까? 컴파일 오류 ... 논리 오류 ... –

+5

배열이 정의 된 방법을 보여주고 3D 배열을 정렬하여 의미를 정확히 설명하십시오. 정렬은 한 차원에서 의미가 있습니다. 둘 이상의 차원이있는 경우 추가 기준이 필요합니다. – paddy

답변

0

, 내가 구현에 C 포인터 문제를 볼 수 있습니다. 코드는 2 차원 경우에 성공적으로 사용하는 경우 :

const char name1_ = *(const char **)name1; 

내 생각 엔 3D의 경우를 캐스팅하는 것은 정확하지 않은 것입니다 :이 3D의 경우 이후

const char name1_ = **(const char ***)name1; 

을해야하기 때문에

const char name1_ = *(const char ***)name1; 

당신은 포인터를 두 번 참조 해제해야합니다.

-1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

typedef char *Row[2]; 

int compare(const void *row1, const void *row2){ 
    const Row *name1 = (const Row*)row1; 
    const Row *name2 = (const Row*)row2; 
    return strlen((*name2)[0]) - strlen((*name1)[0]); 
} 
/* or 
int compare(const void *row1, const void *row2){ 
    const char *name1 = *(const char**)row1; 
    const char *name2 = *(const char**)row2; 
    return strlen(name2) - strlen(name1); 
} 
*/ 

int main(){ 
    char * array1 [][2] = { 
     { "murderer", "termination specialist" }, 
     { "failure", "non-traditional success" }, 
     { "specialist", "person with certified level of knowledge" }, 
     { "incorrect answer", "alternative answer" } 
    }; 
    qsort(array1, sizeof(array1)/sizeof(*array1), sizeof(*array1), compare); 
    {//check 
     int i; 
     for(i=0;i<4;++i) 
      printf("\"%s\", \"%s\"\n", array1[i][0], array1[i][1]); 
    } 
    return 0; 
} 
+0

-1 왜냐하면 답이 아니기 때문입니다. (관련성이 있지만 어쨌든 최소한의 설명이 있어야합니다.) – pmod

+0

@pmod 실제로 작동하는 코드를 제시하면 충분합니다. – BLUEPIXY

+0

이 코드는'char * Row [2]'에 대한 포인터가 무엇인지 비교하기 위해 qsort가 전달하는 것을 명확하게 보여줍니다. – BLUEPIXY