2014-04-21 4 views
2
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int sortstring(const void *str1, const void *str2) { 
    const char *rec1 = str1; 
    const char *rec2 = str2; 
} 

void sortutil(char* lines[]) { 
    qsort(lines, 200, sizeof(char), sortstring); 
} 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include "sortutil.h" 

int getarray(char *lines[]) { 
    int i = 0; 
    char *text = (char *)malloc(200); 
    while (fgets(text, 200, stdin) != NULL) { 
     lines[i] = text; 
     i++; 
     text = (char *)malloc(200); 
    } 
    return i; 
} 

void printarray(char *lines[], int max) { 
    for (int i = 0; i < max; i++) 
     printf("%s\n\n", lines[i]); 
} 

int main(int argc, char* argv[]) { 
    char* arr[100]; 
    int numlines = getarray(arr); 
    printf("There are %d lines\n", numlines); 
    printarray(arr, numlines); 

    for (int i = 1; i < argc; i++) { 
     if (strcmp(argv[i], "-s") == 0) { 
      sortutil(arr); 
      printarray(arr, numlines); 
     } 
    } 
} 

, 그것은 파일을 읽고 그것을 밖으로 인쇄,하지만 난 -s를 호출하고 qsort 함수를 호출 할 때, 그것은 null로 돌아 오는 것입니다. qsort incorrectly을 사용하고 있는데, 포인터를 배열에 사용할 때 올바른 방법은 무엇입니까?qsort를 문자열 배열에 사용하는 방법은 무엇입니까? 나는 임의의 텍스트 파일에 보낼 때

답변

3

비교기가 각 쌍의 주소를 통해 전송됩니다. 나는. 그것들은 char to pointer-to-pointer이다.

변경에 대한 비교 :

int sortstring(const void *str1, const void *str2) 
{ 
    char *const *pp1 = str1; 
    char *const *pp2 = str2; 
    return strcmp(*pp1, *pp2); 
} 

가 마찬가지로, 당신의 sortutil 요구 항목의 수를 알 수있는 정렬뿐만 아니라 각 항목의 정확한 크기를 통과된다.

void sortutil(char* lines[], int count) 
{ 
    qsort(lines, count, sizeof(*lines), sortstring); 
} 

마지막으로, main()에서 호출이 다음과 같아야합니다 :에 그 변화을해야

sortutil(arr, numlines); 

있다.

+0

감사 대신 사용 '때문에 수 그게 작동 했어, 당신이 놓친 유일한 것은 str1과 str2를 (const char **) –

+0

@ user3427042와 함께 넣는 것이었다. 실제로 나는 게시 된 코드 (duh)에서 올바른 유형을 놓쳤다. 그것은 지금 무엇이었을 것입니다. 미안합니다. 올바르게 끝나면 캐스트가 필요하지 않습니다. 그것을 잡아 주셔서 감사합니다. 기쁜 데 도움이되었습니다. – WhozCraig

1

이 줄은 잘못되었습니다. compar 기능을 가져 무엇

qsort(lines, 200, sizeof(char*), sortstring); 
2

qsort(lines, 200, sizeof(char), sortstring); 

변경이이 경우에, char에 대한 포인터 배열의 요소에 대한 포인터입니다. 따라서 str1str2 매개 변수는 실제로 char에 대한 포인터에 대한 포인터입니다. 이처럼 그들을 캐스팅해야합니다

int sortstring(const void *str1, const void *str2) 
{ 
    const char *rec1 = *(char**)str1; 
    const char *rec2 = *(char**)str2; 
    int val = strcmp(rec1, rec2); 

    return val; 
} 

는 그런 다음 qsort에 적절한 요소 크기를 사용해야합니다.

qsort(lines, 200, sizeof(char*), sortstring); 
+0

는 내가 분할 오류 (코어 덤프) 얻을 오류 –

+0

(200 개) 요소가없는 lines'는, 어쩌면 당신이 sortutil''에 매개 변수로'numlines'을 통과 할 수 있으며, 200 – imreal