我无法弄清楚如何使用qsort。我想排序一个字符串数组。像这样:
John Adam
Adam -> John
Stacy Stacy
然而,我所做的一切似乎都没有用。我已经尝试完全复制其他人使用过的东西(来自各种来源的大约5种不同的qsort函数)并且没有任何效果。我有一个适用于int的工作(向后但至少可以工作)。
这是我所拥有的必要代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char name[80];
int age;
} RECORD;
RECORD record[25];
int main (int argc, char *argv[80]){ // Using command line to get my strings
int i = 2, j;
for(j = 0; j < (argc / 2); j++) //Converting and storing my ages
{
record[j].age = atoi(argv[i]);
i = i + 2;
}
int p, q = 1;
for(p = 0; p < (argc / 2); p++)
{
strcpy(record[p].name, argv[q]);
q = q + 2;
}
}
int compareByName(const void* a, const void* b) //The qsort that doesn't work at all
{
const char *ia = (const char *)a;
const char *ib = (const char *)b;
return strncmp(ia, ib, 25);
}
int compareByAge (const void * a, const void * b) //My other qsort that works backwards
{
RECORD *RECORDA = (RECORD *)a;
RECORD *RECORDB = (RECORD *)b;
return ( RECORDB->age - RECORDA->age );
}
void printRecords(RECORD r[], int num){
//printing stuff here
double size = sizeof r[0];
double count = sizeof(r)/size; //My qsort with size stuff, doesn't work
qsort(r, count, size, compareByName); // if I do it the same as the other
qsort (r, 25, sizeof(RECORD), compareByAge); //My other qsort that works backwards
//more printing stuff here
}
答案 0 :(得分:4)
你没有一个字符串数组,你有一个RECORD
数组,听起来你想根据记录的name
数组中的字符串对该数组进行排序。所以你需要这样的东西:
int compareByName(const void *a_, const void *b_) {
RECORD *a = a_, *b = b_;
return strcmp(a->name, b->name);
}
然后用
排序qsort (r, 25, sizeof(RECORD), compareByName);
答案 1 :(得分:1)
好的,我在这里看到了几个问题。
值得注意的是sizeof
在编译时被评估,因此您无法使用sizeof(r)
来确定传递的动态大小的数组的大小。我猜这就是num
传递给printRecords
的原因。
正如@Chris指出的那样,你正在排序RECORD
结构而不是字符指针,所以比较函数和qsort
调用都需要考虑到这一点。
您在年龄比较中反转减法 - 如果左侧小于右侧,则需要返回负数,因此请使用RECORDA->age - RECORDB->age
。
答案 2 :(得分:1)
首先关闭(这就是为什么你的字符串不排序),double count = sizeof(r)/size;
是错误的。 sizeof(r)没有做你期望的事情。您需要将此数组的大小传递给printRecords(),如此问题中所述:
How to get the length of array in C? is "sizeof" is one of the solution?
第二关,
int compareByAge (const void * a, const void * b) //My other qsort that works backwards
是向后的,因为你正在倒退。比较器功能总是返回A - B,而不是B - A.