c中的qsort()函数用于比较字符串数组

时间:2017-03-29 16:34:26

标签: c qsort arrayofstring

我正在尝试在C中重新创建Linux命令ls。我正在使用该程序(通过作为命令行参数传入的目录列表,并将所有内容推送到字符串数组)。

现在我试图为命令实现快速排序标志(例如ls -s /dev),它应该按字典顺序打印出所有内容。问题是qsort()中的stdlib.h方法仅排除"排序"我的程序的一个元素(基本上交换数组中的第一个和最后一个元素)。

我不知道什么是错的,因为我的所有指针都已正确设置。我在下面添加了相关的代码段,如果有什么东西引起了我的注意,请告诉我两天的情况。

比较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只能工作一次(技术上甚至没有通过数组而不是递归多次以完成算法)。

1 个答案:

答案 0 :(得分:2)

你认为比较函数从你的数组中取两个元素时犯了一个常见的错误 - 它实际上是在你的数组中有两个指向元素的指针所以你应该像这样调用strcmp

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