好的,所以我需要用C编写几个相当长的字符串,所以我对自己说:“为什么,你最好使用那个方便的花哨的qsort函数!最好为它写一个string_comparator!”
所以我当然喜欢,她就是这样的:
int string_comparator(const void* el1, const void* el2) {
char* x = (char*) el1;
char* y = (char*) el2;
int str_len = strlen(x);
int i = 0;
for (; i < str_len; i++) {
//when there are non-equal chars
if (x[i] != y[i]) {
break;
}
}
return x[i] - y[i];
}因此,我当然会将我方便的string_comparator函数传递给C qsort函数:
qsort(list.words, list.num_words, sizeof(char*), string_comparator);list是一个包含char** (单词)和it的结构,it表示它包含的单词数(例如num_words)
现在我遇到了问题,我的列表没有像我希望的那样按字母顺序排序!我在我的比较器中放了一堆printf语句,每次它都会打印出这些字符串的垃圾值,所以我相当确定这就是问题所在。但是为什么会有这样的问题呢?我以前用过qsort (从来没有对words..just排序字符进行排序),据我所知,这应该是可行的……这里出了什么问题?
非常感谢大家的建议!
发布于 2012-12-07 14:19:43
这是使用qsort()时的常见错误。以下是更正:
char *x = *(char **) el1;
char *y = *(char **) el2;因为list.words的类型是char **,而不是char *,对吧?
qsort()的另一个示例
下面是如何使用qsort()对int数组进行排序
int int_comparator(const void *el1, const void *el2)
{
int x = *(int *) el1;
int y = *(int *) el2;
return x - y;
}
void sort_ints(int *a, size_t n)
{
// these two lines are both "correct"
// the second line is more "obviously correct"
// qsort(a, n, sizeof(int), int_comparator);
qsort(a, n, sizeof(*a), int_comparator);
}现在,如果您使用char *替换int,则必须使用char **替换int *。
https://stackoverflow.com/questions/13757952
复制相似问题