有关qsort排序字符串中compare函数中应强制转化为二级指针还是一级指针的问题

有关qsort排序字符串中compare函数中应强制转化为二级指针还是一级指针的问题

概述:
在使用qsort给字符串排序时编写其中的compare 函数

 return strcmp((char*)a ,(char*)b )
 return strcmp(*(char**)a,*(char**)b);

尤其让孩子头疼
于是,在这里发表一下自己的见解,以及各种正确情况的对比,如果有大佬知晓的话,还望不吝赐教。

qsort函数

1.存于<stdlib.h>的头文件中
2.函数原型
void qsort (void* base, //数组首元素地址
size_t num, //数组元素的个数
size_t size, //每个元素所占字节大小
int (compar)(const void, const void*));//回调函数compare的地址(这里是一个函数指针,是一个指向函数的指针)

实例

下面我们给三个字符串排序,这里仅做qsort排序
(下面我们省略头文件以及输出,便于观察)

输入样例

zhang
li
wang

#二维数组


int compare(const void*a,const void*b)
{
    return strcmp((char*)a ,(char*)b );//正确
   // return strcmp(*(char**)a,*(char**)b);
   //运行时出现了segemetion fault
}
int main()
{
    char a[3][100];
    int i,j;
    for(i=0;i<3;i++)
    {
        scanf("%s",a[i]);
    }
    
    qsort(a,3,sizeof(a[0]),compare);//qsort部分


  
    return 0;
}

错误样例:
在这里插入图片描述

#数组指针


int compare(const void*a,const void*b)
{
 //return strcmp((char*)a,(char*)b);//答案有误,运行后答案原封不动的输出了
      return strcmp(*(char**)a,*(char**)b);//正确:w
}
int main()
{
    char *p[3];
    char a[3][100];
    int i;
    for(i=0;i<3;i++)
    {
        p[i]=a[i];
    }//把二维数组首地址赋给指针数组
    for(i=0;i<3;i++)
    {
        scanf("%s",p[i]);
    }//依次输入字符串



    `qsort(p,3,sizeof(p[i]),compare);`//qsort 部分


    return 0;
}

错误样例:
在这里插入图片描述

#动态分配的二维指针


int compare(const void *a,const void *b)
{
 //return strcmp((char*)a,(char*)b);//输出时未达到预期排序顺序
     return strcmp(*(char**)a,*(char**)b);//正确
}
int main()
{
    char**a;
    char ch[100];
    int n=3,i,j;
 //创建二维指针                   
    a=(char**)malloc(n*sizeof(char*));
    if(a==NULL)
    {
        free(a);
        exit(1);
    }
    for(i=0;i<n;i++)
    {
        a[i]=(char*)malloc(100*sizeof(char));
        if(a[i]==NULL)
        {
            for( j=0;j<=i;j++)
                free(a[j]);
        }
    }
    //输入
    for(i=0;i<n;i++)
    {
        scanf("%s",a[i]);
    }
   // 排序


    qsort(a,n,sizeof(a[0]),compare);//qsort部分


    
    // free掉
    for(i=0;i<n;i++)
    {
        free(a[i]);
    }
    free(a);
    return 0;
}
 

错误样例:
在这里插入图片描述

分析

 qsort(a,3,sizeof(a[0]),compare);//二维数组a[3][100] 
 qsort(p,3,sizeof(p[i]),compare);//数组指针*p[3]
 qsort(a,n,sizeof(a[0]),compare);//动态分配的char **a

第一种使用(char*)转换
后两种使用(char**)转换
那么会不会是数组与指针的差别所造成的呢?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值