C語言50題之模擬實現atof、atoi

jhcconan614發表於2016-12-19

atof,就是 把字串轉換成浮點數,這個函式就可以完成,他們的家族有很多:atoi,itoa,其中的意思,就不詳細說了,這裡舉出一個即可,都是一個家族的嘛,都與規律的。
首先說一下關於字串轉換成數字的問題,例如:“12345”要轉換就是12345,那麼,要是字串中出現其他的字元,例如:“123ah”,這種情況呢?
顯然這就是異常了,我們要寫好這個函式,首先就得分析一下這個異常處理的情況:
首先應處理的就是空;如果是空,那就算了;然後就是正負號;然後是小數點;最後就是正常的情況處理了。話不多說,來看看吧!

模擬實現atof

//模擬實現atof
double my_atof(char const *p)
{
    double ret = 0;
    int flag = 1;
    int count = 0;
    assert(p != NULL);
    while (isspace(*p))
    {
        p++;
    }
    while (*p)
    {
        if (count)
        {
            count = count * 10;
        }
        if (*p == '+')
            p++;
        else if (*p == '-')
        {
            p++;
            flag = -1;
        }
        else if (*p == '.')
        {
            count++;
            p++;
        }
        else if (*p >= '0'&& *p <= '9')
        {
            ret = ret * 10 + (*p - '0');
            p++;
        }
        else
            return 0;
    }
    return ret*flag / count;
}

int main()
{
    printf("%f\n", my_atof(" +23.45"));
    printf("%f\n", my_atof(" -2.345"));
    printf("%f\n", my_atof("+234.5"));
    printf("%f\n", my_atof("-23.45"));
    printf("%f\n", my_atof("2.345"));
    printf("%f\n", my_atof("234.5"));
    printf("%f\n", my_atof(" ."));
    printf("%f\n", my_atof("12.3ab"));
    system("pause");
    return 0;
}

這裡總共列舉了幾個情況,根據它們的輸出結果,或許會得出一些結論:
這裡寫圖片描述

atoi的實現和atof的是一樣的,畢竟是一個家族的:

atoi() 函式會掃描引數 str 字串,跳過前面的空白字元(例如空格,tab縮排等,可以通過 isspace() 函式來檢測),直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束時(‘\0’)才結束轉換,並將結果返回。

相關文章