之前一直用qsort对整型数组进行排序,qsort同样可以对字符数组排序。但是这次对字符串指针数组排序,属实是绕了一会,记录一下。
前言
qsort排序
一、字符型指针数组排序
1、qsort头文件
#include <stdlib.h>
2、qsort 写法
void qsort (void *base, size_t nitems, size_t size, int (*compar) (const void *, const void*))
3、对字符型指针数组进行排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STRING_COUNT 4
int comp(const void* a, const void* b)
{
int diff = strcmp((char*)((int*)(*(int*)a)) , (char*)((int*)(*(int*)b)));
return diff;
}
int main()
{
char *p[STRING_COUNT];
for(int i = 0; i < STRING_COUNT; i++)
{
p[i] = (char*)malloc(sizeof(char) * 10);
}
p[0] = "hello!";
p[1] = "world";
p[2] = "test";
p[3] = "goodbye";
qsort(p, STRING_COUNT, sizeof(char*), comp);
for(int i = 0; i < STRING_COUNT; i++)
{
printf("%s\n", p[i]);
}
}
//goodbye
//hello!
//test
//world
过程中也是调试了很多次!
理解为qsort将指针数组的成员,即指针传给comp函数,comp的形参接受的是指针数组的成员。这个成员对应的是char型数组的地址。所以形参是地址。地址要看成是int型,强制类型转换成int型,再将常量强制转换成地址的方式(unsigned int*)转成地址类型,即可以解析出char型字符串。
作为strcmp的参数还有再转成(char*)。
另外qsort(p, STRING_COUNT, sizeof(char*), comp);这边要这样写。
3.2 更新
2024年4月1日10:44:44
这两天由于写牛客的题目,重新联系到qsort用法以及对字符串数组排序的问题,这边对上述字符串指针数组排序的代码重新梳理一遍。对于上面第一版的代码,肯定是有问题的。下面是新修改的代码
第一版百思不解版
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STRING_COUNT 4
int comp(const void* a, const void* b)
{
int diff = strcmp( (char*)(*((char*)a)), (char*)(*((char*)b)) );
return diff;
}
int main()
{
char *p[STRING_COUNT];
for(int i = 0; i < STRING_COUNT; i++)
{
p[i] = (char*)malloc(sizeof(char) * 10);
}
p[0] = "hello!";
p[1] = "world";
p[2] = "test";
p[3] = "goodbye";
qsort(p, STRING_COUNT, sizeof(char*), comp);
for(int i = 0; i < STRING_COUNT; i++)
{
printf("%s\n", p[i]);
}
}
上述代码一通尝试没有实现效果,根本不知道问题出在哪里,最后还是百度得到了正确的处理方法,见下面的代码。
第二版成功版
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define STRING_COUNT 4
int comp(const void* a, const void* b)
{
int diff = strcmp( (*(char**)a), (*(char**)b) ); //实参是指针数组,形参变成了二级指针。这边先由void*强转成原二级指针类型。再解引用使用,成功
return diff;
}
int main()
{
char *p[STRING_COUNT];
for(int i = 0; i < STRING_COUNT; i++)
{
p[i] = (char*)malloc(sizeof(char) * 10);
}
p[0] = "hello!";
p[1] = "world";
p[2] = "test";
p[3] = "goodbye";
qsort(p, STRING_COUNT, sizeof(char*), comp);
for(int i = 0; i < STRING_COUNT; i++)
{
printf("%s\n", p[i]);
}
}
//goodbye
//hello!
//test
//world
参考自帖子:
4、关于qsort第三个参数的疑虑
根据帖子的解释,第二个参数是数组元素的个数,第三个参数是数组元素的大小。
那么对于HJ27代码,传参形式是sizeof(*dstStrArray),dstStrArray是静态二维数组,sizeof(*dstStrArray)是数组长度11。上面的代码中传参是sizeof(char*),第一个参数str是动态二维数组。sizeof(char*)的值是4。为什么会出现这种不同的传参实参呢?
又联系到结构体数组传参第三个参数是结构体大小。所以目前这样认为,第三个参数是数组元素大小。至于如果数组元素是指针,那么要做强制类型转换,转换成原数组类型,再做处理。HJ27的参数也是指针。。
额,这边好像又乱了,先这样吧。
遗留问题:
1、第三参数传参问题。
2、指针指向数组,sizeof问题
3、函数指针数组问题
总结
后面可以回顾一下。