【发布时间】:2018-04-03 15:43:12
【问题描述】:
我编写了这段代码 sn-p 以将字符串数组排序为最小化它们连接的顺序:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmpstr(const void* p1, const void* p2){
int p1l = strlen((const char*)p1);
int p2l = strlen((const char*)p2);
int r = strncmp((const char*)p1, (const char*)p2, p1l<p2l?p1l:p2l);
if(r == 0 && p1l != p2l){
if(p1l < p2l){
return cmpstr(p1, (const char*)p2 + p1l);
}
return cmpstr((const char*)p1 + p2l, p2);
}
return r;
}
int main(){
const char* arrstr[] = {"93", "936", "15", "152", "946"};
int num = sizeof(arrstr) / sizeof(char*);
qsort(arrstr, num, sizeof(char*), cmpstr);
for(int i = 0; i < num; i++){
printf("%s\n", arrstr[i]);
}
}
这些字符串应按 15 152 936 93 946 的顺序排序。我们希望 93 介于 936 和 946 之间,因为 936 93 93 936 和 93 946 946 93(为了清楚起见忽略添加的空格)。
但是代码没有按预期工作。尽管我对cmpstr() 的测试完全符合我的预期,但数组根本没有排序。
我做错了什么?
我注意到,当我将cmpstr() 的演员阵容从*(char* const*) 更改为(char*) 时,qsort() 无法正常工作。这是为什么呢?
【问题讨论】:
-
"qsort()中使用的比较函数有什么限制" 你试过阅读
std::qsort的文档吗? -
没有理由声明该函数
static。这看起来像是货物狂热的编程,在不理解为什么的情况下使用它。 -
@tadman:可能不明白为什么,但强烈建议只在单个编译单元中使用函数
static,以免污染程序的命名空间。有时好来自货物崇拜。例如。雷鬼。 -
@Olaf 如果这是一个复杂的多文件应用程序,使用起来很容易,但这是一个完全不合适的单文件程序。我担心人们会使用这些东西,因为他们看到有人做过一次,然后将其吸收到某种仪式中。当你的函数行为异常时,这会导致混乱。
-
@tad:它会导致任何问题吗?不!所以没有造成伤害。您的论点没有意义,最好指出空参数列表是一个过时的功能并且强烈反对。应该是
int main(void)。