【问题标题】:string_comparator in CC中的字符串比较器
【发布时间】:2012-12-07 06:18:19
【问题描述】:

好吧,所以我需要在 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_comarator 函数传递给 C qsort 函数:

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

list 是一个结构,它包含一个 char**(单词)和 int,它引用它所包含的单词数(例如 num_words)

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

感谢任何建议!

【问题讨论】:

    标签: c comparator cstring qsort


    【解决方案1】:

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

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

    因为list.wordschar ** 类型,而不是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);
    }
    

    现在,如果您将int 替换为char *,则必须将int * 替换为char **

    【讨论】:

    • 是的……所以它传递了一个指向整个列表的指针?在某个地址?
    • 比较函数。似乎它有一个 char** 传递给它?这种语法背后的原因是什么?
    • @Ethan:比较函数有两个参数。参数是指向数组中元素的指针。你的元素是char *。您的数组中没有char。请参阅int 的示例。
    • OHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH。啊!!因为它需要一个指针……哎呀。谢谢!当我被允许时,我会在 7 分钟内接受作为答案
    • @Ethan list.words 很可能是一个指针数组,例如const char* words [N] = { "hello", "world", ... };。由于 qsort 需要一个指针,因此数组在传递给 qsort 时会衰减为指向其第一个元素的指针。
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2016-02-08
    • 2013-11-22
    相关资源
    最近更新 更多