我在编写一个我们应该写的函数时遇到了一些麻烦。据说,这是它应该如何工作,但它给了我不兼容的指针类型错误,我不知道如何解决它。
问题出在引用compare_last函数的qsort中。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_PERSONS 100
//person structure definition goes here
typedef struct{
char last[32];
char first[32];
int year;
}Person;
//function declarations go here
int compare_last(Person * ptr1, Person * ptr2);
void main(void){//main function goes here
char *infilename[20];
char *outfilename[20];
FILE * fptrin;
FILE * fptrout;
int i, j;
Person musicians[MAX_PERSONS];
printf("Enter input file name: ");
scanf("%s", infilename);
printf("Enter output file name: ");
scanf("%s", outfilename);
strcat(*outfilename, ".htm");
fptrin = fopen(*infilename, "r");
fptrout = fopen(*outfilename, "w");
for(i = 0; i < MAX_PERSONS; i++)
{
fscanf(fptrin, "%s %s %i", musicians[i].last, musicians[i].first, &musicians[i].year);
}
qsort(musicians, i, sizeof(musicians[0]), compare_last);
fprintf(fptrout, "<html>\n<body>\n<title>LAB14</title>\n");
for(j = 0; j < i; j++)
{
fprintf(fptrout, "%s %s %i <br>", musicians[j].last, musicians[j].first, musicians[j].year);
}
fprintf(fptrout, "</body>\n</html>\n");
fclose(fptrin);
fclose(fptrout);
}//end main
//function definitions go here
int compare_last(Person * ptr1, Person * ptr2)
{
int result = strcmp(ptr1 -> last, ptr2 -> last);
if(result != 0)
return result;
else
return strcmp(ptr1 -> first, ptr2 -> first);
}
答案 0 :(得分:4)
int compare_last(Person * ptr1, Person * ptr2);
应该是
int compare_last(void * ptr1, void * ptr2);
然后你需要在compare_last
答案 1 :(得分:2)
qsort()
的原型是:
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
因此,您的排序函数需要匹配int(*compar)(const void *, const void *)
,或者在调用qsort()时需要强制转换。
如果要对Person*
进行排序,最简单的方法是根据需要声明排序函数,然后在函数内部进行转换:
static int compare_last(const void *ptr1, const void *ptr2)
{
const Person *p1 = ptr1, *p2 = ptr2;
int result = strcmp(p1 -> last, p2 -> last);
...
}
根本不需要强制转换,因为const void *
可以很好地转换为const Person *
。