2010-08-04 88 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

第一件要解决的问题是,你的结构只允许一个字符串。如果这是真正的代码,你还没有足够的时间来解决这个问题。 – 2010-08-04 15:08:39

+0

@David Thornley:我已经为上面提到的所有字符串分配了内存。我可以毫无问题地显示它们(未分组)。我只想评论他们在哪里举行。 – Frank 2010-08-04 15:14:45

+0

那么你对每个字符串都有一个'str'实例吗?这就是你的代码的样子,但是描述听起来像是想将所有字符串存储在单个'str'实例中 – 2010-08-04 15:23:41

回答

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使用标准的库函数而不是重新创建。 – schot 2010-08-04 15:29:50

0

正如大卫·索恩利已经指出的那样,你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列数组。