1. 程式人生 > >自己實現的atof()和atoi()程式碼

自己實現的atof()和atoi()程式碼

定義函式 double atof(const char *nptr);
函式說明 atof()會掃描引數nptr字串,跳過前面的空格字元,直到遇上數
字或正負符號才開始做轉換,而再遇到非數字或字串結束時
('\0')才結束轉換,並將結果返回。引數nptr字串可包含正負
號、小數點或E(e)來表示指數部分,如123.456或123e-2。
返回值 返回轉換後的浮點型數。
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>


double myatof(const char*s)
{
assert(s!=NULL);
double val,val2,power;
int sign,sign2,i;
//去掉字串中的空格
for(i=0;isspace(s[i]);++i)
;
//判斷正負數 ,並將i指向下一個位置
sign = (s[i] == '-') ? -1:1;
if(s[i] == '+' || s[i] == '-')
i++;
//取浮點數的整數部分
for(val=0.0;isdigit(s[i]) && s[i] !=0;++i)
val = 10*val+s[i]-'0';
//取小數點
if(s[i] == '.')
i++; //後一個位置
//取小數點後面數
for(power=1.0;isdigit(s[i]) && s[i] !=0;++i)
{
val = 10*val+s[i]-'0';
power*=10; //float 放大的倍數
}
val=sign*val/power;

//如果有e的話處理e後面的數字
if(s[i]=='e' || s[i]== 'E'){
i++;
sign2 = (s[i] == '-')?-1:1;
if(s[i] == '+' || s[i] == '-')
i++;
for(val2=0.0;isdigit(s[i]) && s[i] !=0;++i){
val2 = 10*val2+s[i]-'0';
}
if(sign2 == -1)
return val/pow(10,val2);
else
return val*pow(10,val2);
}
return val;
}