#  String to Integer (atoi)

#### Description

Implement atoi to convert a string to an integer.

Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.

Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.

#### Required knowledge

###### Variables type
``````// In 32-bits system
INT_MAX = +2^32 =  2,147,483,647
INT_MIN = -2^32 = -2,147,483,648

// long long range (2^64)
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
``````
###### char to int in ASCII
``````char zero = '0';
char nine= '9';
int digit0 = zero - 48;
int digit9 = nine - 48;
``````

Then, digit0 is 0 and digit9 is 9.

#### My solution

I can expect there are many invalid char in the input string. My first stage is to eliminate useless part and then get the starting location as start. Second, use `result = result*10 + digit` to transfer each char to integer number. The only notice is we have to check variables bound limitation.

``````int myAtoi(char* str) {

int size = strlen(str);
int start = 0;
int sign = 1;
int signFlag = 0;
int count = 0;

// eliminate invalid char before target numbers
while ( str[start] == '0' || str[start] == ' ' || str[start] == '+' || str[start] == '-'){
if ( str[start] == '-'){
sign = sign*-1;
signFlag++;
}else if ( str[start] == '+'){
signFlag++;
}
if ( signFlag > 1){
return 0;
}
start++;
}
if ( str[start-1] == ' ' && signFlag != 0){
return 0;
}

// start counting the result value
long long result = 0;
for ( int i = start ; i < size  ; i++ ){
int digit = str[i] - 48;
if ( digit < 0 || digit > 9 ){
return checkBound(result, sign);
}else{
result = result*10 + digit;
count++;
if ( count > 10 ){
return checkBound(result, sign);
}
}
}
result = checkBound(result, sign);
return result;
}

// check is it out of int and long long limitation
int checkBound(long long input, int sign){

if ( input*sign > 0 && sign < 0){
return INT_MIN;
}else if ( input*sign < 0 && sign > 0){
return INT_MAX;
}else if ( input*sign > INT_MAX ){
return INT_MAX;
}else if ( input*sign < INT_MIN ){
return INT_MIN;
}
return input*sign;
}
``````

#### Others solution

https://discuss.leetcode.com/topic/12955/my-c-code-accepted-with-4ms

It check int bound every time. Other, it use `*str - '0'` to transfer char to int and just `str++` to move to the next location.

``````int myAtoi(char* str) {
long result = 0;
int sign = 1;
//discard the first sequence of whitespace characters.
while(isspace(*str))
{
str++;
}
if((*str == '+') || (*str == '-'))
{
sign = (*str == '+') ? 1:0;
str++;
}
if(!isdigit(*str))
{
return 0;
}
while(isdigit(*str) && (result <= INT_MAX))
{
result = result * 10 + *str - '0' + 0;
str++;
}
if(result > INT_MAX)
{
return sign == 1 ? INT_MAX : INT_MIN;
}
return sign == 1 ? result : -result;
}
``````