c - 对结构中的字符串进行分组

时间:2010-08-04 15:06:43

标签: c string struct

我有一堆看起来像的字符串:

'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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

正如David 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的数组进行排序。