【问题标题】:qsort and strcmp problems when dealing with empty strings and whitespace处理空字符串和空格时的 qsort 和 strcmp 问题
【发布时间】:2015-02-17 00:06:15
【问题描述】:

我在让 qsort 用于字符串数组(确切地说是 char *)时遇到问题。我创建了一个我认为应该适用于 qsort 要求的比较函数,但它似乎根本不起作用。我还需要它来处理空白字符和空白字符串(例如“”)。任何关于我做错的方向或说明将不胜感激。

我的相关源码:

 int compareAlphabetically(const void * a,const  void * b);

void sortStringArray(char * * arrString, int len){
  int size = sizeof(arrString) / sizeof(char *);
  if(*arrString != NULL && len > 1)
    qsort(arrString, size, sizeof(char *), compareAlphabetically);

}

int compareAlphabetically(const void * a, const void * b)
{
  const char *a_p = *(const char **) a;
  const char *b_p = *(const char **) b;
  return strcmp(a_p,b_p);
}

函数定义是(并且应该保持不变):

/**
 * Takes an array of C-strings, and sorts them alphabetically, ascending.
 *
 * arrString: an array of strings
 * len: length of the array 'arrString'
 *
 * For example, 
 * int len;
 * char * * strArr = explode("lady beatle brew", " ", &len);
 * sortStringArray(strArr, len);
 * char * str = implode(strArr, len, " ");
 * printf("%s\n", str); // beatle brew lady
 *
 * Hint: use the <stdlib.h> function "qsort"
 * Hint: you must _clearly_ understand the typecasts.
 */
void sortStringArray(char * * arrString, int len);

【问题讨论】:

  • 我认为这可能与我对 qsort 工作原理的误解或类型转换错误有关
  • 真正的问题是什么?您能否提供一些与您期望的排序不同的示例输入?
  • 这不是排序,我认为这是由于空格是问题,但后来发生了各种情况。请参阅chux答案。他捡起来了。

标签: c arrays string strcmp qsort


【解决方案1】:

尺寸计算错误。

size = sizeof(arrString) / sizeof(char *); 可能总是 1:
指针大小 (char **) 除以指针大小 (char *)。

代码可能需要使用len:

void sortStringArray(char * * arrString, int len){
  if(*arrString != NULL && len > 1) {
    // qsort(arrString, size, sizeof(char *), compareAlphabetically);
    qsort(arrString, len, sizeof(char *), compareAlphabetically);
  }
}

[编辑]

注意:len &gt; 1 在功能上不是必需的。
对于 0 值,不需要len &gt; 1。但由于 len 可能小于 0 并且 size_t 是一些无符号类型(将负数 int 更改为一些无符号 tpye 是灾难),因此使用 len &gt; 1 是谨慎的。

【讨论】:

  • 谢谢!我自己也回答了,但这包括代码改进。
猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2019-11-29
  • 2019-05-03
  • 2017-12-12
相关资源
最近更新 更多