C/C++ 调用qsort/sort 对字符数组排序的cmp函数写法

这个问题屡次碰到解决之后再次遇到又忘记怎么弄了,这次打算彻底搞清楚。

·C

首先对所谓字符数组的排序应该是对(char)*a[]数组而非(char)a[][]进行的排序,后者是无法直接调用qsort实现其排序的。

cmp函数写法:

1 int cmp(const void *a, const void *b){
2     return strcmp(*((char**)a), *((char**)b));
3 }

很容易想象字符串在初始化时已经被分配了特定的存储空间,我们用其首地址标识该字符串。

对于字符数组的排序实际上是对于变量类型:字符型指针(char*)的排序。

排序的结果实际上是(字符)指针 数组元素位置的变化。

因此cmp函数提供了const void型指针的接口,表示被排序的对象。

我们要排序的是*a, *b(类型为void),由于我们要做的是对字符串(字符指针)排序。

首先将其强制转化为指向字符指针的指针,这里相当于申请一个指向字符型的指针p,再让a指向p。

那么有*a = p,这样就间接得到了指向对应字符串的char类型指针。

也就可以同strcmp函数通过对原串的比较排序*a 与 *b。

 qsort函数的写法:

1 qsort(a, n, sizeof(char*), cmp);

·C++

c++的sort要简单些。

sort函数写法:

1 sort(a, a + n, cmp);

cmp函数:

1 bool cmp(char *a, char *b){
2     return strcmp(a, b) < 0;
3 }

由于C++ sort 中cmp函数提供的接口是直接针对元素的排序,所以我们只需考虑对字符指针本身的比较就行了。

posted @ 2015-10-12 22:17  astoninfer  阅读(2488)  评论(0编辑  收藏  举报