2013-06-22 42 views
0

我有我自己的strtol實現,它工作正常,我認爲。它看起來如下:Strtol函數的實現 - cast

long strtol(const char *nPtr, char **endPtr, int base) 
{ 
    const char *start; 
    int number; 
    long int sum = 0; 
    int sign = 1; 
    const char *pos = nPtr; 
    if (*pos == '\0') 
    return 0; 
    start = pos; 
    while (isspace(*pos)) 
    { 
    ++pos; 
    } 
    if (*pos == '-') 
    { 
    sign = -1; 
    ++pos; 
    } 
    if (*pos == '+') 
    ++pos; 
    if (base == 16 || base == 8) 
    { 
    if (base == 16 && *pos == '0') 
     ++pos; 
    if (base == 16 && (*pos == 'x' || *pos == 'X')) 
     ++pos; 
    if (base == 8 && *pos == '0') 
     ++pos; 
    } 
    if (base == 0) 
    { 
    base = 10; 
    if (*pos == '0') 
    { 
     base = 8; 
     ++pos; 
     if (*pos == 'x' || *pos == 'X') 
     { 
     base = 16; 
     ++pos; 
     } 
    } 
    } 
    if ((base < 2 || base > 36) && base != 0) 
    { 
    errno = EINVAL; 
    return 0; 
    } 

    while (*pos != '\0') 
    { 
    number = -1; 
    if ((int) *pos >= 48 && (int) *pos <= 57) 
    { 
     number = (int) *pos - 48; 
    } 
    if (isalpha(*pos)) 
    { 
     number = (int) toupper(*pos) - 55; 
    } 

    if (number < base && number != -1) 
    { 
     if (sign == -1) 
     { 
     if (sum >= ((LONG_MIN + number)/base)) 
      sum = sum * base - number; 
     else 
     { 
      errno = ERANGE; 
      sum = LONG_MIN; 
     } 
     } 
     else 
     { 
     if (sum <= ((LONG_MAX - number)/base)) 
      sum = sum * base + number; 
     else 
     { 
      errno = ERANGE; 
      sum = LONG_MAX; 
     } 
     } 
    } 
    else if (base == 16 && number > base 
     && (*(pos - 1) == 'x' || *(pos - 1) == 'X')) 
    { 
     --pos; 
     break; 
    } 
    else 
     break; 

    ++pos; 
    } 

    if (!isdigit(*(pos - 1)) && !isalpha(*(pos - 1))) 
    pos = start; 

    if (endPtr) 
    *endPtr = (char*) pos; 
    return sum; 
} 

不過,我有一個關於最後一行的問題:

*endPtr = (char*)pos; 

爲什麼我要投POS至(炭),endPtr和POS都是指針爲char,在其他情況下,警告將會說: 賦值使得整型指針沒有強制轉換。 感謝您的幫助

+2

'* endPtr' ='字符*','pos' ='爲const char *'不是同一類型真的。 –

+0

許多標準的C庫函數都有破壞的簽名。字符串文字的類型是char *而不是const char *的副作用。解決這個問題遲到了。 –

+0

你的實現有一個bug:'char * endptr; strtol(「0x!」,&endptr,16); puts(endptr);'你會看到它打印出來的!「 (正確的行爲是打印「x!」)。 – Explorer09

回答

1

*endPtrchar*

posconst char*類型。

+0

@ user2511527:如果你真的很開心,不要忘記接受答案:) –

1

endPtr and pos are both pointers to char

這是錯誤的。由於它們是相同類型的不pos被定義爲

const char *pos= nPtr; 

而且endPtr作爲

char **endPtr 
0

正如指出的那樣別人是因爲const char * p是不一樣的char * p

但是,如果你改變函數的簽名是:

long strtol (const char * nPtr, const char ** endPtr, int base); 

投就沒有必要。

+0

是的,你是對的在改變後 * endPtr = pos; 是正確的。 – user2511527