0

好的,所以我需要在 C 中处理几个相当长的字符串。所以我对自己说“为什么,你最好使用那个方便的花花公子 qsort 函数!最好给自己写一个 string_comarator !”

所以我当然愿意,她在这里:

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_comarator 函数传递给 C qsort 函数,如下所示:

qsort(list.words, list.num_words, sizeof(char*), string_comparator);

list 是一个结构,它包含一个 char** (words) 和 ints,它指代它所持有的单词数 (例如 num_words)

现在我遇到的问题是我的列表没有像我希望的那样按字母顺序排序!我在比较器中放了一堆 printf 语句,它每次都打印出字符串的垃圾值,所以我很确定这是问题所在。但是为什么会出现这个问题??我以前使用过 qsort (从不对单词进行排序..只是对字符进行排序),据我所知,这应该可以工作......这里出了什么问题?

我很感激任何建议!

4

1 回答 1

4

这是使用时的常见错误qsort()。以下是更正:

char *x = *(char **) el1;
char *y = *(char **) el2;

因为list.words有 type char **,而不是 type char *,对吧?

另一个例子qsort()

int以下是对with数组进行排序的方法qsort()

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

现在,如果您通过并替换intchar *,则必须替换int *char **

于 2012-12-07T06:19:42.620 回答