2015-10-27 6 views
0

У меня проблема в моем программировании, я совершенно не знаю, почему я не могу использовать qsort в своей программе для сортировки этих структурных массивов упорядоченным способом? Может каким-то образом помочь мне? в этой программе есть 4 узла, и каждый узел представляет файл, узел имеет имя файла, размер и тип файла. Я хочу сортировать его на основе имени файла, но я совершенно не понимаю, почему qsort не работает вообще!Как использовать qsort в C для сортировки массива struct?

#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 
+0

Как вы отметили C++, принимаете ли вы решение для сортировки по C++? –

+0

, конечно, c или C++ – python3

+0

Что вы имеете в виду? – python3

ответ

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); 
} 

если вы хотите держите свои указатели.

+0

. Примечание: Извините, что удалил мой комментарий. Я подумал о его правильности и не успел передумать. – chux

1

Это очень легко решить с помощью 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 всегда будет достаточно большим, чтобы вместить размер файла?

+0

К сожалению, кто-то удалил тег C++. Хороший ответ в любом случае. – chux

Смежные вопросы