qsort对字符型指针数组排序

之前一直用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

参考自帖子:

HJ27 查找兄弟单词-CSDN博客

 浅学指针(4)函数指针数组和qsort的使用-CSDN博客

4、关于qsort第三个参数的疑虑

根据帖子的解释,第二个参数是数组元素的个数,第三个参数是数组元素的大小。

 那么对于HJ27代码,传参形式是sizeof(*dstStrArray),dstStrArray是静态二维数组,sizeof(*dstStrArray)是数组长度11。上面的代码中传参是sizeof(char*),第一个参数str是动态二维数组。sizeof(char*)的值是4。为什么会出现这种不同的传参实参呢?

又联系到结构体数组传参第三个参数是结构体大小。所以目前这样认为,第三个参数是数组元素大小。至于如果数组元素是指针,那么要做强制类型转换,转换成原数组类型,再做处理。HJ27的参数也是指针。。

额,这边好像又乱了,先这样吧。

遗留问题:

1、第三参数传参问题。

2、指针指向数组,sizeof问题

3、函数指针数组问题


总结

后面可以回顾一下。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值