[英]how to use qsort in C to sort struct array?
我在編程中遇到問題,我完全不知道為什么我不能在程序中使用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
被刪除評論的作者說的是
int cmp(Node *a,Node *b) {
return strcmp(a->filename,b->filename);
}
應該
int cmp(Node **a,Node **b) {
return strcmp((*a)->filename,(*b)->filename);
}
如果您想保留指針。
使用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
時間總會足以容納文件大小嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.