我有我自己的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,在其他情況下,警告將會說: 賦值使得整型指針沒有強制轉換。 感謝您的幫助
'* endPtr' ='字符*','pos' ='爲const char *'不是同一類型真的。 –
許多標準的C庫函數都有破壞的簽名。字符串文字的類型是char *而不是const char *的副作用。解決這個問題遲到了。 –
你的實現有一個bug:'char * endptr; strtol(「0x!」,&endptr,16); puts(endptr);'你會看到它打印出來的!「 (正確的行爲是打印「x!」)。 – Explorer09