【问题标题】:c - grouping strings in a structc - 在结构中对字符串进行分组
【发布时间】:2010-08-04 15:06:42
【问题描述】:

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

'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

基本上按'-'后面的记号对它们进行分组

这样做的好方法是什么?处理字符串后,我应该将它们存储在第二个结构中吗?任何想法将不胜感激。谢谢

【问题讨论】:

  • 首先要解决的是您的结构只允许一个字符串。如果那是真正的代码,那么您还远远没有遇到这个问题。
  • @David Thornley:我已经为上面提到的所有字符串分配了内存。我可以毫无问题地显示它们(未分组)。我只是想评论他们被关押在哪里。
  • 那么每个字符串都有一个str 实例吗?这就是您的代码的样子,但描述听起来像是您想将所有字符串存储在单个 str 实例中
  • @Michael Mrozek:很抱歉描述错误。是的,每个字符串都有一个 str 实例。

标签: c string struct


【解决方案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 用于使用标准库函数而不是重新发明。
【解决方案2】:

正如 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);
}

然后,您将使用该比较函数对 records 数组进行排序。

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2023-03-11
    • 2012-09-13
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多