测测您是否细心,一段蒙了2个老板的代码^

测测你是否细心,一段蒙了2个老板的代码^_^
嗯,先别看回贴,你看得出bug在哪吗?呵呵,一个小小的bug导致我加班一晚上没找出来,
2个老板亲自找也没找着bug在哪哦^_^
C/C++ code

#include <stdio.h>
/*
 * 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。
 * 字段以','分开,并且字段有可能为空。
 */
static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";

int main(int argc,char* argv[])
{
    int field = 0;
    int i;
    int loc;
    float pdop,hdop,vdop;

    for(i = 0; (gsa[i] != 0) && (gsa[i]!='*'); i++){/* '*' 或空格为结束符 */
        if(gsa[i]==',') field++;/*当前字段*/
        switch(field){
            case 2:
                sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/
                break;
            case 15:
                sscanf(gsa + i + 1, "%f", &pdop);
                break;
            case 16:
                sscanf(gsa + i + 1, "%f", &hdop);
                break;
            case 17:
                sscanf(gsa + i + 1, "%f", &vdop);
                break;
            default:
                break;
        }
    }
    printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
            loc, pdop, hdop, vdop);
    return 0;
}




------解决方案--------------------
这充分说明,
闭门造车是不好的,如果你的source open一些,bug很快就可以找到,设计也可以改进~

C/C++ code

#include <stdio.h>
#include <string.h>
/*
 * 功能说明:解析NMEA语句中的GPGSA语句,提取第2,15,16,17个字段。
 * 字段以','分开,并且字段有可能为空。
 */
static char *gsa = "$GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*34";

int main(int argc,char* argv[])
{
    int field = 0;
    int i;
    int loc;
    float pdop,hdop,vdop;
    /********************  BETTER SOLUTION */
#define MAX_GSA 256
    char *iter = gsa;
    for(iter = strchr(iter, ','); iter; iter = strchr(iter, ',')) {
        if (*iter)
            ++iter;
        ++field;
        if (field == 2)
            sscanf(iter, "%d", &loc);
        if (field == 15)
            sscanf(iter, "%f", &pdop);
        if (field == 16)
            sscanf(iter, "%f", &hdop);
        if (field == 17)
            sscanf(iter, "%f", &vdop);
    }
    printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
           loc, pdop, hdop, vdop);
    /********************  BETTER SOLUTION */
    
    for(i = 0; (gsa[i] != 0) && (gsa[i]!='*'); i++){/* '*' 或空格为结束符 */
        if (gsa[i]==',')
            field++;/*当前字段*/
        switch(field){
            case 2:
                sscanf(gsa + i + 1, "%d", &loc);/*从','下一字符开始sscanf*/
                break;
            case 15:
                printf(gsa + i + 1);            /*这两句可以帮忙发现bug*/
                printf("---field: %d\n", field); /*同一field不该多次出现*/
                sscanf(gsa + i + 1, "%f", &pdop);
                while (gsa[i+1] && gsa[i+1] != ',') /*hack fix*/
                    ++i;
                break;
            case 16:
                printf(gsa + i + 1);
                printf("---field: %d\n", field);
                sscanf(gsa + i + 1, "%f", &hdop);
                while (gsa[i+1] && gsa[i+1] != ',')
                    ++i;
                break;
            case 17:
                printf(gsa + i + 1);
                printf("---field: %d\n", field);
                sscanf(gsa + i + 1, "%f", &vdop);
                while (gsa[i+1] && gsa[i+1] != ',')
                    ++i;
                break;
            default:
                break;
        }
    }
    printf("loc = %d, pdop = %2.1f, hdop = %2.1f, vdop = %2.1f\n",
            loc, pdop, hdop, vdop);

    
    return 0;
}

------解决方案--------------------
不知道楼主有没用单步调试? 发现问题应该不难~~

当然,当局者迷,有时候就会这样,一个很小的问题,花了很久找出来,然后回头笑自己,:)