您想使用该qsort()
功能。
qsort(base, num_of_elements, element_size, my_compare);
比较函数my_compare
接受两个参数,每个参数 a const void *
,并返回一个数字,指示参数的相对顺序。负数表示第一个参数在第二个参数之前。正数表示第一个参数在第二个参数之后。如果参数比较相等,则返回零。
由于您的字符串比较不区分大小写,因此您需要创建自己的比较函数,或者查找系统提供的不属于 C 库的一部分的比较函数。POSIX 提供strcasecmp()
了这个目的(谷歌告诉我这_stricmp()
在 Windows 上可用)。
int my_compare (const void *a, const void *b) {
return strcasecmp(a, b);
}
定义比较函数通常是使用qsort()
. 您必须了解传递给该函数的指针的上下文。当一个数组TYPE
被传入时qsort()
,它将传递一个指向const TYPE
比较函数每个参数的指针。
在您的情况下,您将传入一个MAX_CHAR_LEN
char
s 数组的数组。因此,比较函数的每个参数都是指向MAX_CHAR_LEN
char
s 的 const 数组的指针。这意味着从技术上讲,该my_compare
函数应该这样编写:
int my_compare (const void *a, const void *b) {
typedef char TYPE[MAX_CHAR_LEN];
const TYPE *aa = (const TYPE *)a;
const TYPE *bb = (const TYPE *)b;
return strcasecmp(*aa, *bb);
}
通常不需要对参数进行强制转换,除非 C 并不真正支持常量数组的概念。它将这样的东西转换为常量数组,因此需要强制转换来反映这一点。
但是,数组的地址等于其第一个元素的地址。也就是说,对于上面的代码,以下断言是正确的:
assert(aa == (const void *)*aa);
assert(bb == (const void *)*bb);
因此,因为指向数组的指针的取消引用等于同一数组的衰减地址值,所以第一个实现my_compare()
对于您的二维数组就足够了。