C語言 atof 的實現

2021-07-26 00:08:22 字數 1635 閱讀 7541

網上搜了幾個關於atof()實現的部落格,實現的都不是很全面,有的未考慮科學計數法,有的未考慮非法輸入,所以打算自己實現atof()。

將字串表示的浮點數轉化為double型別;可以採用科學計數法,如1.34e3 代表 1340.0;忽略前置空格;能夠考慮正負數值;能夠識別非法輸入;(截斷至非法字元處,如atof(」 12.2c32」)輸出為12.2)。

double my_atof(const

char *str);

為了提高效率,我們只能遍歷一次字串,為此我們需要小數點及e或e的位置。

double my_atof(const char *str)

else

if (*p == '+')

++p;

int hasdot = 0,hase = 0;

double integerpart = 0.0,decimalpart = 0.0;

//遇到'e'或'.'字元則退出迴圈,設定hase和hasdot。

for (; *p; ++p)

else

if (*p == 'e' || *p == 'e')

else //如果遇到非法字元,則擷取合法字元得到的數值,返回結果。

return integerpart;

}//上一部分迴圈中斷有三種情況,一是遍歷完成,這種情況下一部分的迴圈會自動跳過;其次便是是遇到'.'或'e',兩種hase和hasdot只可能乙個為真,若hasdot為真則計算小數部分,若hase為真則計算指數部分。

int decimaldigits = 1;

int exponential = 0;

for (; *p; p++)

else

if (hase && isdigit(*p))

exponential = 10 * exponential + *p - '0';

else

break;

}//上一部分較難理解的就是else

if (hasdot && (*p == 'e' || *p == 'e')) 這一特殊情況,對於合法的浮點數,出現'.'字元後,仍然有可能是科學計數法表示,但是出現'e'之後,指數部分不能為小數(這符合對atof()的定義)。這種情況變數integerpart和decimalpart都是科學計數法的基數,因此有integerpart += decimalpart(這使得intergerpart的命名可能欠妥,basepart可能是一種好的選擇)。

//上一部分迴圈結束一般情況下就能返回結果了,除非遇到前文所述的特殊情況,對於特殊情況需要繼續計算指數。

if (hase && hasdot)

for (; *p; p++)

if (isdigit(*p))

exponential = 10 * exponential + *p - '0';

return sign * (integerpart * pow(10, exponential) + decimalpart);

}

以上便是我的atof()實現,注釋附有解釋,若有疑問或批評和建議,敬請指正。

c 語言實現 atof 函式

2.實現 atof 函式功能 c 庫函式 double atof const char str 屬於庫函式stdlib.h,把引數 str 所指向的字串轉換為乙個浮點數。具體操作為 跳過字串開始的空白符,識別數字,點好,或正負符號,開始掃瞄合法浮點表達形式,直到遇到非合法字元結束掃瞄。如果空白符後是...

atof 和atoi 的模擬實現

下面是將字串解析成浮點數需要考慮的格式 注意,下面考慮的所有東西可能不存在字串中 刪除無意義的空格 考慮該字串的符號 解析第一段正文 假如遇到不合法字元,那麼解析到此結束 否則繼續往下解析 看是否有小數點 解析第二段正文 看是否存在e e 假如存在e e,那麼就開始判斷指數的符號和指數的大小 判斷符...

atoi函式和atof函式實現

本文對於最基本的功能,實現atoi和atof函式,對於含有e的次冪的字串,只需要新增一部分單獨處理即可。atoi函式 include include include stdlib.h using namespace std int myatoi char s else if s while s 0 ...