大家。我正在尝试更改我的比较功能,几乎一切都还好,但是如果我在自己的infile中写了0 -5.5之类的东西作为输出,我会在qsort之后得到-5.5大于0的信息,那是不正确的。您能检查一下我的代码并告诉我该怎么办吗?
int compare(const void *str1, const void *str2)
{
char *number1, *number2;
int len1=0, len2=0, dot1=0, dot2=0, value=0;
int minus1=0, minus2=0;
number1 = *(char**)str1;
number2 = *(char**)str2;
while(*number1=='0') number1++;
while(*number2=='0') number2++;
while(*number1 || *number2){
if(value==0) {value= *number1-*number2;}
if(*number1){
if(*number1=='-') number1++;
if(*number1=='-') minus1=1;
if(*number1!='.'){
number1++;
if(dot1==1) len1++;}
if(*number1=='.'){
number1++;
dot1=0;}
}
if(*number2){
if(*number2=='-') number2++;
if(*number2=='-') minus2=1;
if(*number2!='.'){
number2++;
if(dot2==1) len2++;}
if(*number2=='.'){
number2++;
dot2=0;}
}
}
if(minus1>0 && minus2==0){return -1;}
if(minus1==0 && minus2>0){return 1;}
if(minus1>0 && minus2>0){
if(len1>len2) return -1;
if(len2>len1) return 1;
return (-value);}
if(len1>len2) return 1;
if(len2>len1) return -1;
return value;
}
最佳答案
我建议在double
和qsort
处理的数组中使用bsearch
。
但是,如果您坚持使用char *
:
int compare( const void * l, const void * r ) {
char * lerr = NULL;
char * rerr = NULL;
double left = strtod((const char *)l, &lerr );
double right = strtod((const char *)l, &rerr );
return (*lerr||*rerr) ? (int)(l-r) : (int)(left-right);
}
Documentation of strtod
关于c - qsort比较功能行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21590731/