【问题标题】:qsort of struct array not workingqsort 的结构数组不起作用
【发布时间】:2012-01-11 08:59:28
【问题描述】:

我正在尝试按 char 对名为 results 的 struct run 数组进行排序,但是当我打印该数组时,没有任何内容被排序。看看这个:

struct run {
  char name[20], weekday[4], month[10];
  (And some more...)
};
typedef struct run run;

int name_compare(const void *a, const void *b) 
{
    run *run1 = *(run **)a;
    run *run2 = *(run **)b;
    return strcmp(run1->name, run2->name);
}

int count_number_of_different_persons(run results[])
{
  int i = 0;


  qsort(results, sizeof(results) / sizeof(run), sizeof(run), name_compare);

  for(i = 0; i <= 999; i++)
  {
    printf("%s\n", results[i].name);
  }
  // not done with this function yet, just return 0
  return 0;
}

上面的输出只是一个按最初放置顺序排列的名称列表

【问题讨论】:

    标签: c string struct qsort


    【解决方案1】:

    检查以下代码:

    正如@michel 提到的, sizeof(array) 提供指针的大小,而不是数组本身的大小,因为在传递数组时它被视为指针。因此,要么将元素数量发送到函数 count_number_of_different_persons,要么定义一个元素数量的 MACRO。希望这可以帮助。 :)。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define NOE 3
    
    struct run
    {
        char name[20];
    };
    
    typedef struct run run;
    
    int name_compare (const void *a, const void *b )
    {
        return strcmp (((run *)a)->name, ((run *)b)->name);
    }
    
    int count_number_of_different_persons(run results[], int noOfElements)
    {
        int i=0;
        qsort(results, noOfElements, sizeof (run), name_compare);
        for (i=0; i<noOfElements; i++)
            printf ("%s\n",results[i].name);
    }
    
    int main ( int argc, char * argv[])
    {
        run a, b, c;
        run  arg[NOE];
    
        strcpy (a.name, "love");
        strcpy (b.name, "you");
        strcpy (c.name, "i");
        arg[0] = a;
        arg[1] = b;
        arg[2] = c;
    
        count_number_of_different_persons(arg, sizeof(arg)/sizeof(run));
    };
    

    【讨论】:

      【解决方案2】:

      name_compare 有一个问题。试试这个:

      int name_compare(const void *a, const void *b) 
      {
          run *run1 = (run *)a;
          run *run2 = (run *)b;
          return strcmp(run1->name, run2->name);
      }
      

      【讨论】:

        【解决方案3】:
        int count_number_of_different_persons(run results[])
        

        这并不能真正让您在数组上使用sizeof,因为数组已衰减为指针。

        这个

        run *run1 = *(run **)a;
        

        看起来也很奇怪,不是吗

        run *run1 = (run*)a;
        

        ?

        【讨论】:

        • void* avoid* b 是指向数组项的指针。如果数组本身由指向类型定义为run 的结构的指针组成,那么void* a 的正确转换是(run**)a。这仍然只是一个指向指针的指针,因此要获得指向结构的指针,必须取消引用这个指针指针。因此,*(run**)a。尽管看起来确实像这里,但该数组不是指针数组,而是一个直数组,因此可以按照您的说法进行正确的转换,(run*)a。 (我刚刚遇到这个问题,找到了这个帖子,以为对其他人有帮助)。
        • @NickBauer,我真的希望它能对其他人有所帮助,但我现在无法真正解密它,4 年后,断章取义,懒得重新阅读和重新思考原始问题和答案。
        猜你喜欢
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多