处理空字符串和空格时的 qsort 和 strcmp 问题
qsort and strcmp problems when dealing with empty strings and whitespace
我在让 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);
尺寸计算错误。
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
更改为某些无符号类型是灾难),使用 len > 1
是明智的。
我在让 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);
尺寸计算错误。
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
更改为某些无符号类型是灾难),使用 len > 1
是明智的。