【问题标题】:how to use qsort in C to sort struct array?如何在 C 中使用 qsort 对结构数组进行排序?
【发布时间】:2015-10-27 01:01:37
【问题描述】:

我的编程有问题,我完全不知道为什么我不能在我的程序中使用 qsort 以有序的方式对这些结构数组进行排序?有什么办法可以帮助我吗?在这个程序中,有4个节点,每个节点代表一个文件,节点有文件名、大小和文件类型。我想根据文件名对其进行排序,但我完全不知道为什么 qsort 根本不起作用!

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>



//int cmp(const void *a,const void*b);



typedef struct  node
{
        char filename[255];
        char filetype[255];
        long ofilesize;
        long newfilesize;
}Node;
Node Line[4];

int cmp(const void *a,const void*b)
{

    return strcmp(((Node *)a)->filename,((Node *)b)->filename);
}

int main(){
  /*  int j=0;
    for(;j<4;j++){
       Line[j]=(Node*)malloc(sizeof(Node));

    }*/
    strcpy(Line[0].filename,"b.txt");
   strcpy(Line[1].filename,"c.txt");
    strcpy(Line[2].filename,"d.txt");
     strcpy(Line[3].filename,"e.txt");

    int i=0;
    for(;i<4;i++){
       strcpy(Line[i].filetype,"regular file");
       Line[i].ofilesize=i;
       Line[i].newfilesize=i;

    }    



    for(i=0;i<4;i++)
    {
printf("File %s has type %s original size %ld new size %ld \n",Line[i].filename,Line[i].filetype,Line[i].ofilesize,Line[i].newfilesize);

    }

     qsort((void *)&Line,4,sizeof(Node),cmp);


    for(i=0;i<4;i++)
    {
printf("File %s has type %s original size %ld new size %ld \n",Line[i].filename,Line[i].filetype,Line[i].ofilesize,Line[i].newfilesize);

    }


}

这是我的输出:

File b.txt has type regular file original size 0 new size 0 
File c.txt has type regular file original size 1 new size 1 
File d.txt has type regular file original size 2 new size 2 
File e.txt has type regular file original size 3 new size 3 
File b.txt has type regular file original size 0 new size 0 
File c.txt has type regular file original size 1 new size 1 
File d.txt has type regular file original size 2 new size 2 
File e.txt has type regular file original size 3 new size 3 

【问题讨论】:

  • 当您标记 C++ 时,您会接受 C++ 排序解决方案吗?
  • 当然是c或者c++
  • define 'doesn't work at all' - 向我们展示你的输出。
  • 他的意思是你的排序指针而不是结构,所以 cmp 获取指向指针的指针。
  • 所以,我不应该使用指针来排序,我需要使用Node line[4],并使用line 来排序?对吗?

标签: c qsort


【解决方案1】:

被删评论的作者说的是

int cmp(Node *a,Node *b) {
    return strcmp(a->filename,b->filename);
}

应该是

int cmp(Node **a,Node **b) {
    return strcmp((*a)->filename,(*b)->filename);
}

如果你想保留你的指针。

【讨论】:

  • 注意:很抱歉删除了我的评论 - 我重新考虑了它的正确性,没有时间重新考虑。
【解决方案2】:

这很容易使用 C++11 解决。让编译器为你处理内存分配,避免那些讨厌的指针。

#include <array>
#include <string>
#include <algorithm>

struct Node
{
    std::string filename;
    std::string filetype;
    long ofilesize;
    long newfilesize;
};

bool CompareByFilename(const Node& lhs, const Node& rhs)
{
    return lhs.filename < rhs.filename;
}

int main()
{
    std::array<Node, 4> line;
    line[0].filename = "e.txt";
    line[1].filename = "d.txt";
    line[2].filename = "c.txt";
    line[3].filename = "b.txt";

    for (unsigned int i = 0; i < line.size(); i++)
    {
        line[i].filetype = "regular file";
        line[i].ofilesize = i;
        line[i].newfilesize = i;
    }

    std::sort(line.begin(), line.end(), CompareByFilename);
}

考虑使用枚举作为文件类型,您确定long 总是足够大以容纳文件大小吗?

【讨论】:

  • 不幸的是,有人删除了 C++ 标签。无论如何,很好的答案。
猜你喜欢
  • 2021-07-16
  • 2021-04-07
  • 2014-05-21
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多