2017-03-29 3 views
0

C에서 Linux 명령 ls을 다시 만들려고합니다. 프로그램이 작동합니다 (명령 줄 인수로 전달 된 디렉토리 목록을 통해 모든 문자열의 배열에 대한 내용).문자열의 배열을 비교하는 데 사용되는 qsort() 함수

이제 모든 내용을 사전 순으로 인쇄해야하는 명령 (예 : ls -s /dev)에 대해 quicksort 플래그를 구현하려고합니다. 문제는 stdlib.hqsort() 메소드가 내 프로그램에 대해 하나의 요소 (기본적으로 배열의 첫 번째 요소와 마지막 요소를 바꿉니다) 만 "정렬"한다는 것입니다.

내 포인터가 제대로 설정되어있어 무엇이 잘못되었는지 전혀 알 수 없습니다. 아래에 관련 스 니펫 코드를 추가하고 있습니다. 2 일 동안 내 눈을 뗄 수없는 것이 있으면 알려주세요.

qsort에 대한 비교 기능 :

int normalCompare (const void *stringOne, const void *stringTwo) { 
    return strcmp((const char *)stringOne, (const char *)stringTwo); 
} 

실제 함수 호출 :

void execute_ls(char **directoryList, Flags flags) { 

    //Create a buffer for directories' file names 
    char **fileNamesList; 
    fileNamesList = malloc(MAX_FILES * sizeof (*fileNamesList)); 
    int fileBufferCurrentPointer = 0; 

    //Fill the buffer out by calling execute_ls_one_dir on all the directories 
    int i = 0; 
    while(directoryList[i] != NULL) { 
     execute_ls_one_dir(directoryList[i], fileNamesList, &fileBufferCurrentPointer); 
     i++; 
    } 
    fileNamesList[fileBufferCurrentPointer] = NULL; 

    //Process the array 
    if(flags.s == 1) { 
     qsort(fileNamesList, fileBufferCurrentPointer, sizeof (char *), normalCompare); 
    } 
    else if(flags.r == 1) { 
     qsort(fileNamesList, fileBufferCurrentPointer, sizeof (char *), reverseCompare); 
    } 

    //Print to user 
    for(i = 0; i < fileBufferCurrentPointer; i++) { 
     if(((*fileNamesList[i] == '.') && (flags.a == 1)) || (*fileNamesList[i] != '.')) { 
     printf("%s\n", fileNamesList[i]); 
     } 
    } 

    //Deallocate fileNamesList 
    for(i = 0; i < MAX_FILES; i++) { 
     free(fileNamesList[i]); 
    } 
    free(fileNamesList); 
} 

업데이트] fileBufferCurrentPointer :

while((oneDirEntryPtr = readdir(currentDirPtr)) != NULL) { 

    // Push the file name onto the fileNamesList array 
    fileNamesList[*fileBufferCurrentPointer] = malloc(MAX_LEN_NAME * sizeof (char)); 
    strcpy(fileNamesList[*fileBufferCurrentPointer], oneDirEntryPtr->d_name); 
    *fileBufferCurrentPointer += 1; 
} 

qsort이 한 번만 작동하는 이유는 혼란 스럽습니다. 기술적으로 알고리즘을 완료하기 위해 반복적으로 여러 번 반복하지 않고 한 번만 지나치지 않습니다.

당신이 당신의 배열에서 두 개의 요소를 가지고있는 비교 함수를 생각하는 일반적인 실수를했습니다
+0

같은 STRCMP 호출해야하므로 실제로 이것은 배열의 요소에 두 개의 포인터를 복용 중복 질문. 그것은 그것이 중복되는 질문을 찾는 것이 겸손하게 어렵습니다. –

+0

@JonathanLeffler 일부 미세 조정을 한 후에는 거의 작동하지만 배열의 일부 요소가 처음부터 배치되어 배열의 다른 모든 요소가 올바르게 정렬됩니다. – ScaVenGerS

+0

MCVE ([MCVE]) 없이는 도움이되지 않을 수도 있습니다. 나는 당신이 당신의 문제 중 하나를 정확하게 진단하는 현재의 대답을 받아 들여야한다고 생각합니다. 그런 다음 MCVE를 만들어 새로운 질문을하십시오. 샘플 입력 데이터, 출력 및 기대하는 출력이 필요합니다. 귀하의 코드는 상대적으로 작을 것입니다. 디렉토리를 읽지 않아야합니다. 내장 된 shuffled 목록을 사용하여 정렬 할 수 있습니다. 물론, 그것은 당신의 문제를 재현하지 않을 수도 있지만, 그런 다음 당신에게 어디서 볼지에 대한 단서를 제공합니다. MCVE가 문제를 재현해야합니다. –

답변

2

-이

int normalCompare (const void *stringOne, const void *stringTwo) { 
    return strcmp(*(const char **)stringOne, *(const char **)stringTwo); 
} 
+0

그건 의미가 있습니다! 하지만 지금은 거의 작동 중입니다. 처음 몇 개의 파일 이름이 뒤죽박죽이지만 4 ~ 5 개의 파일 이름 뒤에 제대로 작동합니다. – ScaVenGerS

+0

너무 많이 풀면 루프가 MAX_FILES까지 올라가지만 fileBufferCurrentPointer에서 멈춰야합니다. 이것은 당신이보고있는 이상함을 설명 할 수있는 모든 종류의 기억 문제를 야기 할 것입니다. –

+0

방금 ​​전에 본 것을 감사드립니다. 그래도 결과는 도움이되지 않습니다. – ScaVenGerS