Q我正尝试使用qsort来对一个字符串数组进行排序,并使用strcmp作为比较函数,但它不起作用。
A您说的“字符串数组”很可能指的是“指向char的指针数组”。qsortqsortchar. strcmp的比较函数的参数是指向被排序对象的指针,在这个例子中,是指向指向char的指针。然而,strcmp接受的是指向
/* compare strings via pointers */ int pstrcmp(const void *p1, const void *p2) { return strcmp(*(char * const *)p1, *(char * const *)p2); }
的简单指针。因此,const void *比较函数的参数被表示为“通用指针”,char。它们被转换回它们“真实的”类型(指向指向char *的strcmp.
。对qsort的调用可能看起来像这样:
#include <stdlib.h> char *strings[NSTRINGS]; int nstrings; /* nstrings cells of strings[] are to be sorted */ qsort(strings, nstrings, sizeof(char *), pstrcmp);
(不要被 K&R2 第 5.11 节第 119-20 页的讨论误导,该讨论并没有讨论标准库的qsort,并且做了一个无声的、不必要的关于char *和void *).
和指向指针的指针等价的假设。)关于qsort比较函数——它们是如何被调用的以及它们必须如何声明——请参阅问题 13.9。
参考文献:ISO Sec. 7.10.5.2
H&S Sec. 20.5 p. 419