2011-10-31 122 views
6

我是一名從K & R書中學習C的蟒蛇程序員。這看起來像一個非常微不足道的問題,但我仍然難倒了。 下面附帶的是實現atoi()函數的K & R(RIP Ritchie!)書中的一段代碼。瞭解atoi()函數

atoi(s) /*convert s to integer */ 
char s[]; 
{ 
    int i, n, sign; 
    for (i=0; s[i]==' '||s[i] == '\n' || s[i] == '\t'; i++) 
    ; /* skip whitespace */ 
    sign = 1; 
    if (s[i] == '+' || s[i] = '-') /* sign */ 
     sign = (s[i++] == '+') ? 1 : -1; 
    for (n=0; s[i] >= '0' && s[i] <= '9'; i++) 
     n = 10 * n + s[i] - '0'; 
    return (sign * n); 
} 

我的問題:

1)做的第一 'for' 循環服務除了計數有效characaters數量任何目的? 2)如果(1)爲真,則第一個循環將'i'的值設置爲有效字符的數量 - 第二個for循環如何工作而不將i重置爲0?

舉例來說,我輸入'2992'作爲函數的輸入。第一個for循環將i設置爲3,那麼函數的其餘部分如何工作? 我可能會把我的基本知識搞砸,但任何幫助都會非常感激。謝謝,-Craig

+1

我不知道C是_that_可怕的。 –

+0

我認爲理解一段代碼的最好方法就是用調試器(例如gdb)執行它,然後一步步前進。同時閱讀代碼和評論裏面可能會有所幫助。 – eyalm

+0

@PatrickB .:就是_very old_ C.現代C看起來......完全一樣:)(除了現在更清晰的'int atoi(con​​st char * s)'的函數簽名外。) – Mat

回答

10
int atoi(char* str) 
{ 
    if(!str) 
     printf("Enter valid string"); 

    int number = 0; 
    char* p = str; 

    while((*p >= '0') && (*p <= '9')) 
    { 
     number = number * 10 + (*p - '0'); 
     p++; 
    } 
    return number; 
} 

這是ATOI背後的全部想法。

1)您設置的字符數組

2的起始指針),然後內部while循環你去每一個字符乘以10和由0

減去添加字符如果你想嘗試2992,那麼這個數字也是2992。

+0

如果OP要回到K&R,那麼我會指出,在C89中,你不能把聲明放在mid-code:http://stackoverflow.com/questions/288441/variable-declaration-placement-在-C – HostileFork

4

第一個循環做了評論所說的:它跳過空格。

之後,i是第一個非空白字符的索引,這正是您需要進行的操作。

1

不,第一個循環跳過空白,就像評論說的那樣。

1

該評論提供了答案:第一個循環是跳過空格。對於2992i將保持0

1

第一個for循環提前我指向第一個非空白字符。

循環之間的條件記錄了符號(如果有的話)。

然後最後的for循環做了實際的轉換。

最後,應用該符號,並返回結果。

0

1)沒有第一個循環不計算字符數,但它計數的第一個位置的數字,如果只有起始字符是空格,即這個「-2992」我將1和「2992」我將0. 2)sign = (s[i++] == '+') ? 1 : -1;該語句檢查第i個字符是否爲符號並使計數器增加1 [i ++],對於下一個循環,這是我第一個字符串中的起始數字。如果我讓0然後第一個條件輸入您的檢查章程將是空間!

編輯1:第一個輸入是「space space-2992」