Felix那里看到的,关于用qsort对指针式字符串数组和二维型字符串数组的排序的,觉得值得贴出来。注意下下面两片代码的区别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | const int N = 4; char *str[N] = { "xyz", "cdef", "abcd", "caaa"}; int cmp(const void *l, const void *r) { const char *a = *((char**)l); const char *b = *((char**)r); return strcmp(a, b); } int main(int argc, char **argv) { qsort( (void*)str, N, sizeof(int*), cmp ); for(int i = 0; i < N; ++i) { printf("%s\n", str[i]); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | const int N = 4; char str[N][10] = { "xyz", "cdef", "abcd", "caaa"}; int main(int argc, char **argv) { qsort( (void*)str, N, sizeof(char)*10, ( int(*)(const void*, const void*) )strcmp ); for(int i = 0; i < N; ++i) { printf("%s\n", str[i]); } return 0; } |
对qsort需要注意几点:
- qsort中第一个参数是待排序数组的开始地址,既然是数组,各元素就是同类型、同大小的对象,且数组是“一维数组”(即地址是连续的);
- qsort用以区分对象的依据是第二和第三个参数,分别表示对象个数和每个对象的大小(字节);
- qsort并不知道每个对象的类型和结构,排序准则由用户在第四个参数(比较函数)中指出,qsort按该比较函数准则的“升序”对数组进行排序;
- 标准C不支持运算符重载,各对象的交换(因为这是qsort)靠的是逐字节的拷贝(memcpy?)。
在上面的两片代码中,待排序的对象一个是字符型指针,一个是char (*)[10]型数组。然后,就没有然后了。
然后,上面代码,gcc编译出错,g++却可以。
const int N = 4; char *str[N];可以。
const int N = 4; char *str[N] = {“a”,”b”,”c”,”d”};却不可,何解?
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
C语言中的常量定义是用宏定义,#define N 4,这样才对。C语言中的const只表示这个值不会变,但并不是在编译时确定它的值,所以gcc编译肯定会出错。C++中使用const定义常量,所以g++可以通过。
另,char str[N] = {“a”,”b”,”c”,”d”};这里,你定义一个字符数组str,但是里面的每个值居然都是双引号,所以就错了。双引号是字符串,单引号是字符。
谢谢!
笔误……