我有一堆看起来像的字符串:
'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
基本上在' - '
之后用标记对它们进行分组这样做的好方法是什么?我应该在处理完字符串后将它们存储在第二个结构上吗?任何想法将不胜感激。感谢
答案 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
的数组进行排序。