Я пишу функцию сравнения, которая сравнивает и упорядочивает имена в порядке возрастания фамилии и, если обе фамилии совпадают, в порядке убывания имен. Функция, которую я сейчас имею, не будет этого делать.
Вот функция:
int namecmp(const void *p, const void *q)
{
const name *pp = p;
const name *qq = q;
int n;
if((n = strcmp(pp->last, qq->last)) != 0)
return n;
return qq->first - pp->first;
}
Я пытаюсь организовать динамический массив структур, вот мои структуры.
typedef struct
{
char last[NAMESIZE];
char first[NAMESIZE];
}name;
typedef struct
{
int id;
name name;
float score;
}record;
typedef struct {
record *data; /* the dynamic array */
size_t nalloc; /* number of records allocated */
size_t nused; /* number of records in use */
} record_list;
и вот как называется qsort.
qsort(list->data, list->nused, sizeof(list->data[0]), namecmp);
Любая помощь будет оценена.
РЕДАКТИРОВАТЬ: я сделал то, что вы предложили, теперь у меня неправильный вывод.
мой вывод:
3456789 Burns, Monty: 100.00
4567890 Simpson, Lisa: 95.00
1234567 Simpson, Homer: 35.50
6666666 Simpson, Bart: 45.00
2345678 Flanders, Ned: 99.50
РЕДАКТИРОВАТЬ 2:
Как сохранить строку в структуре.
if(sscanf(line,"%s", lastname) == 1)
{
if(strlen(lastname) < NAMESIZE)
{
lastname[0] = toupper((int)lastname[0]);
strcpy(rec->name.last, lastname);
break;
}
}