您想使用qsort() 函数。
qsort(base, num_of_elements, element_size, my_compare);
比较函数my_compare 接受两个参数,每个参数一个const void *,并返回一个表示参数相对顺序的数字。负数表示第一个参数在第二个参数之前。正数表示第一个参数在第二个参数之后。如果参数比较相等,则返回零。
由于您的字符串比较不区分大小写,因此您需要创建自己的比较函数,或者找到您的系统提供给您的不属于 C 库的一部分。 POSIX 为此提供了strcasecmp()(Google 告诉我_stricmp() 在Windows 上可用)。
int my_compare (const void *a, const void *b) {
return strcasecmp(a, b);
}
定义比较函数通常是使用qsort() 时最棘手的部分。您必须了解传递给该函数的指针的上下文。当TYPE 的数组传入qsort() 时,它会将指向const TYPE 的指针传递给比较函数的每个参数。
在您的情况下,您将传入MAX_CHAR_LENchars 的数组数组。因此,比较函数的每个参数都是指向MAX_CHAR_LENchars 的常量数组的指针。这意味着从技术上讲,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() 的第一个实现对于您的二维数组来说已经足够了。