【发布时间】:2021-08-04 04:29:23
【问题描述】:
我用 qsort 以两种方式对字符串数组(argv 本身)进行排序。我从 linux man 3 qsort 示例开始。那里cmpstringp只有一行:
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcmp(*(const char **) p1, *(const char **) p2);
我试图重新表述它,它编译时没有警告只有
char *const* sp1 = vep1
即const 位于中间 - 它是 argv 条目 (?)。至少这是 qsort 声明所要求的。上面从手册页转换的内容似乎不同且复杂。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* vep: void pointer to elements being qsorted
sp: string pointer (char **) */
int
cmpstringp(const void *vep1, const void *vep2) {
char *const *sp1 = vep1,
*const *sp2 = vep2;
return strcmp(*sp1, *sp2);
}
/* Make char* from void*, and even char */
int
cmpchar(const void *p1, const void *p2) {
const char *cp1 = p1,
*cp2 = p2;
char c1 = *cp1,
c2 = *cp2;
if (c1 == c2)
return 0;
else
return c1 > c2 ? 1 : -1;
}
/* Sort cmd line args in two ways with qsort */
int main(int argc, char **argv) {
/* sort chars of each string */
for (int i = 1; i < argc; i++)
qsort(argv[i], // base / first
strlen(argv[i]), 1, // n_elems, elem_size
cmpchar);
/* sort argv strings 1 to argc-1 */
qsort(argv + 1,
argc - 1, sizeof *argv,
cmpstringp);
for (int j = 1; j < argc; j++)
puts(argv[j]);
return 0;
}
第二个 cmp 函数 cmpchar 有一个额外的分配级别。没有就会有一些像if (*cp1 == *cp2)这样无害的明星。
How do I sort the elements of argv in C? 有一个类似手册页的解决方案,直接在strcmp() 中进行转换。
但是我的免演员方法不是更正确吗?在我将 const 放在它所属的位置之前,我收到了警告。
【问题讨论】:
-
cp1和sp1不是空指针。 -
免费
explicit casts -
@user3386109,你是对的。 OP 对其参数阻抗问题的解决方案将隐式转换部署到中介,而不使用任何强制转换运算符。代码生成和质量方面的影响可以说是 NIL,但我太累了,无法进一步争论更精细的问题。