2010-08-04 7 views
0

У меня есть куча строк, которые выглядят как:гр - группировка строк в структуры

'Hello1-FOO', 'Aello2-FOO', 'Bye1-BAR', 'Bye3-BAR', 'Hello22-FOO', 'Bye4-BAR', 'Welcome-BAR' ...

Все они хранятся на структуры.

struct str { 
    char *strings; 
} 
... 
struct str **t_str; 
size_t j; 
t_str = malloc(sizeof *t_str * 20); 
for (j = 0; j < 20; j++) 
    t_str[j] = malloc(sizeof *t_str[j]); 
... 
t_str[0]->strings = "Hello1-FOO"; 
t_str[1]->strings = "Aello2-FOO"; 
.... 

То, что я хотел бы сделать, это показать (вид) их по категориям, так что они выглядят примерно так:

FOO: 
Hello1-FOO 
Aello2-FOO 
Hello22-FOO 

BAR: 
Bye4-BAR 
Welcome-BAR 
Bye1-BAR 
Bye3-BAR 

В основном сгруппировать их маркером, после того, как «-»

Что было бы хорошим способом сделать это? Должен ли я хранить их во второй структуре после обработки строки? Любая идея будет оценена по достоинству. Спасибо

+1

Первое, что нужно исправить, это то, что ваша структура допускает только одну строку. Если это реальный код, вы еще недостаточно продвинулись, чтобы решить эту проблему. –

+0

@David Thornley: Я уже выделил память для всех строк, упомянутых выше. Я могу отображать их (без группировки) без проблем. Я просто хотел прокомментировать, где они находятся. – Frank

+0

У вас есть один экземпляр 'str' для каждой строки? Вот как выглядит ваш код, но описание заставило его звучать так, как будто вы хотели сохранить все строки в одном экземпляре 'str' –

ответ

1

Просто используйте qsort. Следующий код делает некоторые предположения, но вы должны иметь возможность изменить его в соответствии с вашими потребностями.

int categoryComparitor(const void * a, const void * b) 
{ 
    char *string1 = (char *)a; 
    char *string2 = (char *)b; 

    string1 = strrchr(string1, '-') + 1; 
    string2 = strrchr(string2, '-') + 1; 

    return strcmp(string1, string2); 
} 


{ 
    ... 
    char *strings[]; // Array of string pointers 
    int stringCount; // Holds current number of valid elements in strings. 
    ... 
    qsort(strings, stringCount, sizeof(char *), categoryComparitor); 
} 
+0

+1 для использования стандартных функций libary вместо повторного использования. – schot

0

Как Дэвид Thornley уже указывалось, ваш 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 с помощью этой функции сравнения ,

Смежные вопросы