Как уже отмечал Дэвид Торнли, ваш struct
на самом деле не очень хорошо справляется с этой ситуацией (ну вообще). Поскольку ваши входные данные представляют собой две отдельные логические части, вы действительно хотите определить структуру соответствующим образом - содержащую две отдельные строки, по одной для каждой части ввода.
struct record {
char *category;
char *string;
};
Затем вы хотите прочитать каждую часть в одну из этих двух строк:
record read_line(FILE *infile) {
char buffer1[128], buffer2[128];
fscanf(infile, "%[^-]-%s", buffer1, buffer2);
record ret;
ret.string = dupe_string(buffer1);
ret.category = dupe_string(buffer2);
return ret;
}
Затем, чтобы отсортировать эти записи, вы захотите определить функцию сравнения с сигнатурой, ожидаемой qsort
, которая выполняет сравнение для члена category
:
int cmp(void *a, void *b) {
return strcmp(((record *)a)->category, ((record *)b)->category);
}
Затем вы отсортируете свой массив record
с помощью этой функции сравнения.