# re: 自己實(shí)現(xiàn)的atof()和atoi()代碼[未登錄] 回復(fù) 更多評(píng)論
2012-02-24 19:53 by
沒有處理前置的空白,這個(gè)功能,標(biāo)準(zhǔn)的atoi都是要有的。
# re: 自己實(shí)現(xiàn)的atof()和atoi()代碼 回復(fù) 更多評(píng)論
2014-09-05 22:27 by
定義函數(shù) double atof(const char *nptr);
函數(shù)說明 atof()會(huì)掃描參數(shù)nptr字符串,跳過前面的空格字符,直到遇上數(shù)
字或正負(fù)符號(hào)才開始做轉(zhuǎn)換,而再遇到非數(shù)字或字符串結(jié)束時(shí)
('\0')才結(jié)束轉(zhuǎn)換,并將結(jié)果返回。參數(shù)nptr字符串可包含正負(fù)
號(hào)、小數(shù)點(diǎn)或E(e)來表示指數(shù)部分,如123.456或123e-2。
返回值 返回轉(zhuǎn)換后的浮點(diǎn)型數(shù)。
#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)
;
//判斷正負(fù)數(shù) ,并將i指向下一個(gè)位置
sign = (s[i] == '-') ? -1:1;
if(s[i] == '+' || s[i] == '-')
i++;
//取浮點(diǎn)數(shù)的整數(shù)部分
for(val=0.0;isdigit(s[i]) && s[i] !=0;++i)
val = 10*val+s[i]-'0';
//取小數(shù)點(diǎn)
if(s[i] == '.')
i++; //后一個(gè)位置
//取小數(shù)點(diǎn)后面數(shù)
for(power=1.0;isdigit(s[i]) && s[i] !=0;++i)
{
val = 10*val+s[i]-'0';
power*=10; //float 放大的倍數(shù)
}
val=sign*val/power;
//如果有e的話處理e后面的數(shù)字
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;
}