2016-01-21 63 views
0

我實現了atoi函數。第一個條件時給出錯誤的答案,而第二個條件,同時給了我正確的答案(提供我遞增,而塊ofcourse裏面的指針)C在條件內部增加一個函數內部的變量

while(isdigit(*(str++))) 
while(isdigit(*str)) 

這是爲什麼?

不應該有條件評估'str'然後增加。然後解除評估地址的引用。然後將它傳遞給isdigit?

有條件的時候(只要它在循環內部增加了)就不會與第二條相同嗎?

下面是完整的代碼,以防萬一:

int atoi(char *str) 
{ 
    int sign, number = 0; 

    while(isspace(*str)) 
     ++str; 

    sign = (*str == '-') ? -1 : 1; 

    if(*str == '-' || *str == '+') 
     str++; 

    //while(isdigit(*(str++))) 
    while(isdigit(*str)) 
    { 
     number = 10 * number + (*str - '0'); 
     str++; 
    } 
    return sign * number; 
} 

回答

3

錯誤的剖析:isdigit(*str++)告訴你,如果字符指向由str是一個數字,所以您決定迭代循環來處理字符 - 但++前進指針之前您輸入循環的正文,因此您處理下一個字符。

此外,如@iharob在下面的評論中指出,str遞增儘管isdigit結果,也當字符不是一個數字。所以第一個非數字字符不會被下面的代碼處理(如果有的話)。

可能與while(isspace(...))相同的問題。

+0

我很抱歉,剛剛意識到你爲什麼說*潛在*你是100%正確的。如果'isspace()'失敗,它將使指針增加。 –

+1

準確地說,不是'if'isspace()'失敗',而是'if'isspace()'返回'false''。 「失敗」意味着該功能會錯誤地將輸入字符分類。 – CiaPan

2

的問題是不是與while (isdigit(*str++)),但是,在這條線

number = 10 * number + (*str - '0'); 

str指向下一個字符的事實,因爲你已經在while條件下遞增str

這就是爲什麼你不能增加while條件中的指針。然而,你可以做到這一點的分配,導致下面的循環

while (isdigit((unsigned char) *str) != 0) 
    number = 10 * number + (*str++ - '0'); 

這是一個可能實現的例子

#include <ctype.h> 

int my_atoi(const char *str) 
{ 
    int sign; 
    int number; 

    number = 0; 

    while (isspace((unsigned char) *str) != 0) 
     ++str; 

    sign = 1; 
    switch (*str) 
    { 
     case '-': 
      sign = -1; 
     case '+': 
      str++; 
      break; 
    } 

    while (isdigit((unsigned char) *str) != 0) 
     number = 10 * number + (*str++ - '0'); 

    return sign * number; 
} 
+0

我剛剛意識到'isspace(0)'會返回'0'以及'isdigit(0)'......我在想什麼?我真的很懷疑...... –