int my_atoi(const char str[]);Solution: The key is to be able to find out the int value of a numeric character.
ASCII value of a numeric character - ASCII value of the character '0' = int value of numeric character.
Ex: '8' - '0' = 8
Code:
#define MIN_INT -2147483648
#define MAX_INT 2147483647
int my_atoi(const char str[])
{
if(str == NULL) return 0;
int len = strlen(str);
if(len <= 0) return 0;
int index = 0;
//skip leading spaces
while(str[index] == ' ') index++;
bool isNeg = str[index] == '-';
int outNum = 0;
if(isNeg)
{
index++;
// skip white space after the sign
while(str[index] == ' ') index++;
}
while(index < len)
{
char currentChar = str[index++];
if(currentChar >= '0' && currentChar <= '9')
{
int oldValue = outNum;
int charVal = currentChar - '0';
outNum *= 10;
outNum += charVal;
//overflow underflow detection
if(outNum < oldValue)
{
if(isNeg)
outNum = MIN_INT;
else
outNum = MAX_INT;
return outNum;
}
}
else
break;
}
if(isNeg)
outNum = outNum * -1;
return outNum;
}
atoi Test Cases:
Input : Output "" : 0 "0" : 0 "1" : 1 "-1" : -1 "10" : 10 "-10" : -10 "1234567890" : 1234567890 "23 45" : 23 " 99" : 99 " -66" : -66 "- 77" : -77 "55 " : 55 "-2147483648" : -2147483648 (MIN) "2147483647" : 2147483647 (MAX) "2147483648" : 2147483647 (overflow) "-2147483649" : -2147483648 (underflow) "abc*" : 0 "23ab" : 23 "23ab34" : 23 "b31" : 0
to test the overflow, it is better to use :
ReplyDeleteif(outNum/10 != oldValue)