C에서 Linux 명령 ls
을 다시 만들려고합니다. 프로그램이 작동합니다 (명령 줄 인수로 전달 된 디렉토리 목록을 통해 모든 문자열의 배열에 대한 내용).문자열의 배열을 비교하는 데 사용되는 qsort() 함수
이제 모든 내용을 사전 순으로 인쇄해야하는 명령 (예 : ls -s /dev
)에 대해 quicksort 플래그를 구현하려고합니다. 문제는 stdlib.h
의 qsort()
메소드가 내 프로그램에 대해 하나의 요소 (기본적으로 배열의 첫 번째 요소와 마지막 요소를 바꿉니다) 만 "정렬"한다는 것입니다.
내 포인터가 제대로 설정되어있어 무엇이 잘못되었는지 전혀 알 수 없습니다. 아래에 관련 스 니펫 코드를 추가하고 있습니다. 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
이 한 번만 작동하는 이유는 혼란 스럽습니다. 기술적으로 알고리즘을 완료하기 위해 반복적으로 여러 번 반복하지 않고 한 번만 지나치지 않습니다.
같은 STRCMP 호출해야하므로 실제로 이것은 배열의 요소에 두 개의 포인터를 복용 중복 질문. 그것은 그것이 중복되는 질문을 찾는 것이 겸손하게 어렵습니다. –
@JonathanLeffler 일부 미세 조정을 한 후에는 거의 작동하지만 배열의 일부 요소가 처음부터 배치되어 배열의 다른 모든 요소가 올바르게 정렬됩니다. – ScaVenGerS
MCVE ([MCVE]) 없이는 도움이되지 않을 수도 있습니다. 나는 당신이 당신의 문제 중 하나를 정확하게 진단하는 현재의 대답을 받아 들여야한다고 생각합니다. 그런 다음 MCVE를 만들어 새로운 질문을하십시오. 샘플 입력 데이터, 출력 및 기대하는 출력이 필요합니다. 귀하의 코드는 상대적으로 작을 것입니다. 디렉토리를 읽지 않아야합니다. 내장 된 shuffled 목록을 사용하여 정렬 할 수 있습니다. 물론, 그것은 당신의 문제를 재현하지 않을 수도 있지만, 그런 다음 당신에게 어디서 볼지에 대한 단서를 제공합니다. MCVE가 문제를 재현해야합니다. –