处理空字符串和空格时的qsort和strcmp问题

时间:2015-02-17 00:06:16

标签: c arrays string strcmp qsort

我遇到问题让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);

1 个答案:

答案 0 :(得分:3)

错误的尺寸计算。

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 > 1
对于值0,不需要len > 1。但由于len可能小于0且size_t是某些无符号类型(并且将负int更改为某些无符号tpye是disater),因此使用len > 1是谨慎的。< / p>