【问题标题】:Qsort function to sort words in array uniquelyQsort函数对数组中的单词进行唯一排序
【发布时间】:2022-11-12 18:36:43
【问题描述】:

我正在尝试构建一个 qsort 函数,该函数将对我的指针数组中的单词进行唯一排序**allwords。但是我在某个地方出错了,我做错了什么? (对 C 很陌生)

static int intcmp(const void *a, const void *b) {
     const int *left = a;
     const int *right = b;
     return *left - *right;
}

【问题讨论】:

  • 如果它真的是一个“数组 if 指针”,那么您的间接级别浅了一个。当然,我们相信你说的是你的意思。除非您发布正确的minimal reproducible example,否则我们不确定,该minimal reproducible example 构建您的待排序数据并将其和此功能呈现给qsort。不相关,如果它是 int 数组,而不是 int* 数组,则此函数可以“工作”,但可能下溢,并且将降序排序,而不是升序排序,这又是我们不知道的意图。当你说你想要“排序单词”时,我非常怀疑你离得很近。
  • 所以你的意思是“词”机器字?您假设哪个对应于类型int?如果您指的是人类语言单位意义上的“单词”,那么您将需要一些完全不同的东西。
  • 另外,独特性与它有什么关系?如果您确实有一个指针数组,那么您是在尝试按指针本身还是按它们指向的值进行排序?
  • 编辑问题以提供minimal reproducible example
  • 通常,唯一排序意味着丢弃重复条目。使用qsort 和普通的比较函数来做到这一点很棘手(如果不是不可能的话),因为这不是qsort 设置要做的事情。

标签: c c-strings string-comparison function-definition qsort


【解决方案1】:

如果指针指向字符串并且您需要比较字符串,那么比较函数将如下所示

static int intcmp(const void *a, const void *b) {
     const char *left = *( const char ** )a;
     const char *right = *( const char ** )b;
     return strcmp( left, right );
}

请注意qsort 传递给比较函数指向已排序数组元素的指针。由于您案例中的元素具有char * 类型,因此指向它们的指针将具有char ** 类型,并分配给const void * 类型的指针。因此,在比较函数中,您需要对从const void *const char ** 的指针进行“反向”转换。

【讨论】:

  • @DavidRanieri 谢谢。我在复制原始代码时打错了。:)
  • 从 const void * 反向转换为 char ** 是什么意思
  • qsort(wordle->allwords, wordle->leng, sizeof(*wordle->allwords), intcmp);这是我正在使用的 qsort
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2016-09-02
  • 2021-05-08
  • 2015-09-16
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多