2017-03-02 3 views
0

이 프로그램은 정수 값을 가져 와서 입력 할 수있는 문자열의 양을 결정하고 사용자가 지정한 문자열의 양을 입력하면 다른 정수를 입력 한 다음 해당 양을 입력 할 수 있습니다 문자열. 끝나면 프로그램은 내림차순으로 길이에 따라 문자열을 정렬합니다. 그러나 qsort가 작동하지 않으면 문자열이 원래 입력 된 순서가 출력됩니다.qsort를 사용하여 문자열 배열 정렬

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


int sort(const void * a, const void * b){ 
    size_t fa = strlen((const char *)a); 
    size_t fb = strlen((const char *)b); 
    return (fa < fb) - (fa > fb); 

} 

int main(void){ 

char pointer[100]; 
int n; 
scanf("%d", &n); 
char** strings = malloc(n * sizeof(char*)); 

int i; 
for (i = 0; i < n; i++){ 
    scanf("%s", pointer); 
    strings[i] = malloc(sizeof(char) * (strlen(pointer) + 1)); 
    strcpy(strings[i], pointer); 

} 

int m; 
scanf("%d", &m); 
strings = realloc(strings, (n + m) * sizeof(char*)); 
for (i = n; i < m + n; i++){ 

    scanf("%s", pointer); 
    strings[i] = malloc(sizeof(char) * (strlen(pointer) + 1)); 
    strcpy(strings[i], pointer); 
} 

int a; 
int g; 
int k = m + n; 
qsort(strings , a, 100, sort); 
for (g = 0; g < k; g++){ 
    printf("%s", strings[g]); 

    printf("\n"); 


} 
} 
+0

이것을 디버깅 해보았습니까? 정렬을 수행 할 때 중단 점을두면 어떤 값이 전달되고 있는지, 올바르게 처리하는지 표시됩니다. –

+0

qsort를 올바르게 사용했는지 잘 모르겠습니다. 데이터를 읽는 중입니다. 그렇지 않으면 아무 것도 인쇄되지 않습니다. –

답변

0

음,이 :

int a; 
int g; 
int k = m + n; 
qsort(strings , a, 100, sort); 

가 전혀 이해되지 않는다, a는 값이 그래서 이것은 정의되지 않은 동작입니다 없습니다.

sort()도 깨졌습니다. strcmp()이어야합니다.

+1

예'sort()'는 깨졌지 만 qsort가 sort 루틴을 호출 할 때'char *'가 두 개'char ** '가되는 두 개의'char *'를 갖기 때문에'strcmp()'로 바꿀 수 없습니다 –

+0

OP가 길이별로 정렬하고 lexicogrpahically가 아닌 – StoryTeller

+0

이 아닌 정렬을 원함에 유의하십시오. 내 sort() 함수 대신 strcmp()를 넣으면 내 문제가 해결됩니다. 죄송합니다. 저는 C에서 상당히 새롭기 때문에 정렬이 어려웠습니다. –

1

qsort을 올바르게 호출하지 않았습니다.

두 번째 매개 변수는 정렬 할 "배열"의 요소 수입니다. 현재 다른 사람이 지적한대로 아무 것도 설정되지 않은 a을 전달 중입니다. "-Wall"옵션을 사용하여 코드를 컴파일하면 이러한 종류의 오류가 표시됩니다.

세 번째 매개 변수는 "배열"에있는 요소 중 하나의 크기이지만 관련이없는 변수 pointer의 크기와 혼동됩니까? sizeof(strings[0])처럼 쓸 수 있습니다.

완료된 통화는 qsort(strings,k,sizeof(strings[0]),sort);과 같아야합니다.

하지만 당신의 sort() 기능이 당신의 "배열"의 요소에 두 개의 포인터를 전달하고 있기 때문에 그 여전히 작동하지 않습니다 (char **) 당신은 "배열"(char *)의 두 가지 요소로 처리하고 있습니다. 그래서 당신은 같은 것을 원할 것입니다

size_t fa = strlen(*(char **)a);