簡體   English   中英

qsort 比較函數行為

[英]qsort compare function behaviour

每個人。 我正在嘗試更改我的比較函數,幾乎一切都很好,但是如果我在 infile 中將 0 -5.5 之類的寫成 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;
}

我建議在qsortbsearch處理的數組中使用double

但如果你堅持使用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);
}

strtod 的文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM