c - группировка строк в структуре - PullRequest
0 голосов
/ 04 августа 2010

У меня есть несколько строк, которые выглядят так:

'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

В основном сгруппируйте их по токену после '-'

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

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Просто используйте 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 голосов
/ 04 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...