c语言 qsort 对结构体数组排序

定义了结构体如下:
typedef struct tagMYDATA
{
char _buf1[10];

char _buf2[10];

}MYDATA, *pMYDATA;

比较:
int cmp(const void* a, const void* b)
{
return strcmp((*(pMYDATA)a)._buf1, (*(pMYDATA)b)._buf1);
}
int main()
{
int _n = 10;

pMYDATA* _data = NULL;
_data = (pMYDATA*)malloc(sizeof(MYDATA)*_n);
//初始化动态数组
qsort(_data, _n, sizeof(_data[0]), cmp);

for(i=0;i<rowcount;i++)
printf("%s\n", _data[i]->_buf1);

return 0;

}

基本的代码就是这样,但是输出的时候是乱码,请各位看看是怎么回事

第1个回答  推荐于2016-10-15
■可能的一个原因是compare 里给a、b赋值的时候,后面强制类型转换应为(struct record *)而非(record *)。
■可能另一个原因是你的源文件名后缀(DECVPP据此判断是C程序还是C++程序),如果是纯C的,就用.c;如果是C++的,用.cpp。
■还有可能是你没有包含必要的头文件?
我根据你的代码做了个简单的测试,在VC6下运行正常(由大到小按point排)。
#include <stdio.h>
#include <stdlib.h>
struct record
{
char name[35];
int point;
int match[3];
int goal[2];
} ;

int compare(const void *p1,const void *p2);
void input(struct record s[], int n);
void output(struct record s[], int n);

int main()
{
struct record team[35];
int teams = 35;
input(team, 5);
qsort(team,teams,sizeof(team[0]),compare);
output(team, 5);
return 0;
}

int compare(const void *p1,const void *p2)
{
struct record *a= (struct record *)p1;
struct record *b= (struct record *)p2;
int result=0;
if(a->point > b->point)
return -1;
else if(a->point< b->point)
return 1;
else
return 0;

}

void output(struct record s[], int n)
{
int i=0;
while(i<n)
{
printf("%d ",s[i].point);
i++;
}
return;
}

void input(struct record s[], int n)
{

int i=0;
while(i<n)
{
scanf("%d",&(s[i].point));
i++;
}
return;
}
是否可以解决您的问题?追问

代码是纯c的,编译通过能运行,不排序输出数组每个元素的字符串正常。

以上您的代码没有任何问题。问题出在我这样分配不对,修改后正确了。

非常感谢这么晚了,帮我解答问题。

本回答被提问者采纳
相似回答