【问题标题】:sort a 2d array using qsort - seg fault使用 qsort 对二维数组进行排序 - 段错误
【发布时间】:2023-05-23 20:43:01
【问题描述】:

我正在尝试对简化版本的二维字符串数组进行排序, (我不想将“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 ;
}

( 更新:更改,以便我直接使用 value(4) 而不是计算 nElem。我的问题是让 qsort 正常工作。 )

【问题讨论】:

  • qsort segfault in C 的可能重复项
  • int nElem = sizeof(nameArray)/sizeof(char *);..hmmmmm...

标签: c arrays qsort


【解决方案1】:

比较函数的参数只是指针,而不是指向指针的指针。

我相信你也不需要强制转换,因为参数是 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);
}

【讨论】:

    【解决方案2】:
    int cstring_cmp(const void *a, const void *b)
    {
      return strcmp(a, b);
    }
    

    【讨论】: