# re: 自己實作的atof()和atoi()代碼 回複 更多評論
2014-09-05 22:27 by memristor
定義函數 double atof(const char *nptr);
函數說明 atof()會掃描參數nptr字元串,跳過前面的空格字元,直到遇上數
字或正負符号才開始做轉換,而再遇到非數字或字元串結束時
('\0')才結束轉換,并将結果傳回。參數nptr字元串可包含正負
号、小數點或E(e)來表示指數部分,如123.456或123e-2。
傳回值 傳回轉換後的浮點型數。
#include
#include
#include
#include
#include
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;
}