문제

클래스 프로젝트에는 문자열 배열을 정렬하는 것이 포함되며 각 문자열은 다음과 같은 동일한 수의 열을 포함합니다.

Cartwright   Wendy    93
Williamson   Mark     81
Thompson     Mark     100
Anderson     John     76
Turner       Dennis   56

이 프로그램은 열을 정렬 할 수있는 명령 줄 인수를 받아들이고 정렬 된 문자열을 변형되지 않은 인쇄해야합니다.

Strtok을 사용하여 각 문자열의 사본을 열로 나누고 다음과 같이 각 라인에 대해 스트러크를 만들고 싶습니다.

struct line {
    char * line;
    char column_to_sort_on[MAX_COLUMN];
}

내 문제는 QSORT가 ARG로 취하는 비교 함수 포인터에 있습니다. 올바르게 이해하면 비교 함수는 두 개의 const void 포인터를 가져와야합니다. 정렬 할 항목에, int를 반환합니다. 이것은 Qsort가 정렬 할 것이 아니기 때문에 포인터를 비교 함수로 전달할 수 없다는 것을 의미합니다. 열 번호를 전달하여 비교 함수를 정렬 할 수 없습니다. 두 개의 Arg 만 사용할 수 있기 때문입니다. 특정 열을 기준 으로이 문자열을 정렬하기 위해이 주위를 어떻게 해결할 수 있습니까?

편집하다: 정렬은 내가 정말로 원하는 경우 Qsort 또는 내 자신의 것으로 제한됩니다. 선택을 주면 Qsort를 선택합니다. :)

# 2 편집 :합의는 열 번호의 글로벌 변수를 사용하거나 QSORT를 사용하여 스트러크 배열을 정렬하는 것 같습니다. 나는 단지 structs를 분류하고 포인터를 사용하여 원래 문자열을 인쇄 할 생각이 없었습니다. 나는 그것이 내가 할 일이라고 생각합니다. 도와 주셔서 감사합니다!

도움이 되었습니까?

해결책

당신은 다음과 같이 스트루크를 전달할 수 있습니다.

struct line {
    char * line;
    char column_to_sort_on[MAX_COLUMN];
}
...

line*  Lines[max_lines]; // here you store the structs

int
cmp_lines( const void *elem1, const void *elem2 )
{
    line*  line1 = *(line**)elem1;
    line*  line2 = *(line**)elem2;
    // do the comparisons
}

qsort(Lines, max_lines, sizeof(line*), cmp_lines);

다른 팁

QSORT를 사용하는 것으로 제한되지 않는다고 가정하면 열 번호를 저장하는 functor 객체와 함께 std :: 정렬을 사용할 수 있습니다. QSORT를 사용해야하는 경우 하나의 빠르고 더러운 솔루션은 열 번호를 전역 변수에 저장하고 비교 함수에 사용하는 것입니다.

다른 비교기 기능은 모두 전체 구조물을 취하지 만 각각은 하나의 열만 사용합니다.

C ++ 또는 C? 당신의 태그를 기반으로, 나는 그것이 C ++라고 가정합니다. STL 방식을 시도해 봅시다.

당신은 사용해야합니다 std::sort 대신에 qsort. std::sort 기능 포인터 (C 대안과 비교할 때)뿐만 아니라 물체 함수라고 할 수 있습니다. 클래스 인스턴스가 기능으로 호출 될 수 있음을 알 수 있습니다. operator(). 솔루션은 간단합니다. 구조시 다른 기능을 생성하는 "functor"클래스를 만듭니다. 그런 다음 정렬 호출은 다음과 같습니다.

std::sort(array, array+size, comparator(2 /* sort by column #2 */));

functor 클래스는 소위 "클로저"를 효과적으로 생성합니다. 로컬 변수를 갖지만 동적으로 생성 된 기능 객체는 이런 방식으로 생성 된 다른 기능 객체와 공유하지 않습니다. 다음과 같습니다.

class comparator{
  private: unsigned int field_n;
  public: comparator(unsigned int _field_n) : field_n(_field_n) {};
  public: int operator () (char const *  lhs, char const * rhs)
       { /* compare here fields with index field_n */ };
};

void pointers 비교 대신 "함수"(즉, 당신이 만든 클래스 인스턴스) 대신 char * 매개 변수이므로 유형 캐스팅으로 자신을 귀찮게하지 않습니다.

불행히도 C에서는 글로벌 변수를 만드는 것 외에 다른 방법으로는 할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top