2015-10-21 88 views
3

我正在學習K & R書。我目前在第4章。我正在閱讀第71頁上的atof()函數。函數atof(s)將字符串轉換爲其雙精度浮點等價。K&R書的練習4-2

ATOF的代碼()是如下:
// ATOF:轉換字符串s翻番

double atof2(char s[]) 
{ 
    double val, power; 
    int i, sign; 

    for (i = 0; isspace(s[i]); ++i) //skip white space 
     ; 
    sign = (s[i] == '-') ? -1: 1; 
    if (s[i] == '-' || s[i] == '-') 
     ++i; 

    for (val = 0.0; isdigit(s[i]); i++) 
     val = 10.0 * val + (s[i] - '0'); 

    if (s[i] == '.') 
     ++i; 
    for (power = 1.0; isdigit(s[i]); i++) { 
     val = 10.0 * val + (s[i] - '0'); 
     power *= 10.0; 
    } 

    return sign * val/power; 

}

我的問題是關於變量:電源。我們爲什麼需要它?

我明白變量的使用:「val」,但我不確定變量:「power」。爲什麼我們用權力來劃分價值?

回答

5

變量power是以權力除數,得到結果作爲浮點數。

讓您的字符串爲-12.83,然後第一個for循環將檢查空間並將i增量爲無空格,i=0

sign將是-1作爲s[i]=s[0]='-'

在接下來的兩個循環中,將字符串的值轉換爲整數並存儲在val,不包括. - 請自行解決)。

現在兩個循環val後將爲1283。但是最後一個循環將迭代2次,power將更改爲100.00(第一次迭代時爲10*1.0,第二次迭代中爲10*10.0)。

現在將浮點值val除以power並乘以sign

那麼,它會返回什麼是-1*1283/100,因此-12.83是你的浮點數。

+0

好的。但爲什麼他們使用了兩個循環:1)for(val = 0.0; isdigit(s [i]); i ++) val = 10.0 * val +(s [i] - '0');和2)for(power = 1.0; isdigit(s [i]); i ++)val = 10.0 * val +(s [i] - '0'); 功率* = 10.0; (val = 0.0,power = 1.0; isdigit(s [i]); i ++)val = 10.0 * val +(s [i])我們不能簡單地將兩個for循環合併到一個循環中, - '0'); 功率* = 10.0; }我希望我的問題明確嗎? –

+1

@HusseinBarada首先將字符串轉換爲數字,直到遇到''。''。它會在遇到任何非數字時結束。第二個循環是將''。'後面的字符轉換爲數字。 – ameyCU

+1

@HusseinBarada'-12.83'第一個循環會將前兩個字符(字符串中的_after_''-'')轉換爲整數並存儲在'val'中,第二個循環將在''後面處理字符。' – ameyCU