有关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**)转换
那么会不会是数组与指针的差别所造成的呢?