使用 qsort 对二维数组进行排序 - 段错误
sort a 2d array using qsort - seg fault
我正在尝试对二维字符串数组进行排序,简化版本看起来像,
(我不想将 "nameArray" 的数据类型更改为 "char *nameArray[4]" )
#include <sys/types.h>
#include <stdio.h>
int cstring_cmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcasecmp(*ia, *ib);
}
int Test()
{
char nameArray[4][10]={"test","alpha","Hyper","city"};
// int nElem = sizeof(nameArray)/sizeof(char *);
int index = 0;
//printf("nElem =%d\n", nElem);
for(index=0; index < 4; index++)
{
printf("-> %s\n", nameArray[index]);
}
qsort( &nameArray[0], 4, sizeof(nameArray[0]), cstring_cmp);
printf("After sort\n");
for(index=0; index < 4; index++)
{
printf("-> %s\n", nameArray[index]);
}
return 0 ;
}
(
更新:已更改,以便我直接使用值 (4) 而不是计算 nElem。我的问题是让 qsort 正常工作。 )
比较函数的参数只是指针,而不是指向指针的指针。
我相信你也不需要强制转换,因为参数是 void *,你可以将它们分配给局部变量,编译器会处理它们。
试试这个:
int cstring_cmp(const void *a, const void *b)
{
const char *ia = a;
const char *ib = b;
return strcasecmp(ia, ib);
}
如果您不需要局部变量,甚至可以删除它们(仅当您计划向比较函数添加更多代码时才需要它们):
int cstring_cmp(const void *a, const void *b)
{
return strcasecmp(a, b);
}
int cstring_cmp(const void *a, const void *b)
{
return strcmp(a, b);
}
我正在尝试对二维字符串数组进行排序,简化版本看起来像, (我不想将 "nameArray" 的数据类型更改为 "char *nameArray[4]" )
#include <sys/types.h>
#include <stdio.h>
int cstring_cmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcasecmp(*ia, *ib);
}
int Test()
{
char nameArray[4][10]={"test","alpha","Hyper","city"};
// int nElem = sizeof(nameArray)/sizeof(char *);
int index = 0;
//printf("nElem =%d\n", nElem);
for(index=0; index < 4; index++)
{
printf("-> %s\n", nameArray[index]);
}
qsort( &nameArray[0], 4, sizeof(nameArray[0]), cstring_cmp);
printf("After sort\n");
for(index=0; index < 4; index++)
{
printf("-> %s\n", nameArray[index]);
}
return 0 ;
}
( 更新:已更改,以便我直接使用值 (4) 而不是计算 nElem。我的问题是让 qsort 正常工作。 )
比较函数的参数只是指针,而不是指向指针的指针。
我相信你也不需要强制转换,因为参数是 void *,你可以将它们分配给局部变量,编译器会处理它们。
试试这个:
int cstring_cmp(const void *a, const void *b)
{
const char *ia = a;
const char *ib = b;
return strcasecmp(ia, ib);
}
如果您不需要局部变量,甚至可以删除它们(仅当您计划向比较函数添加更多代码时才需要它们):
int cstring_cmp(const void *a, const void *b)
{
return strcasecmp(a, b);
}
int cstring_cmp(const void *a, const void *b)
{
return strcmp(a, b);
}