-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstring_to_integer_atoi.c
62 lines (55 loc) · 1.47 KB
/
string_to_integer_atoi.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
inline int GetDigitFromChar(char c) {
return (c - 48);
}
int myAtoi(char * s){
int front = 0;
// ignore leading whitespace
while((s[front] != '\0') && s[front] == ' ') {
++front;
}
// check for plus_minus
int plus_minus = 1;
if(s[front] == '-') {
plus_minus = -1;
++front;
}
else if(s[front] == '+') {
++front;
}
// Process rest of string
int result = 0;
int clamp = INT_MAX / 10;
while(s[front] != '\0') {
// Convert char to digit using ascii value
int digit = GetDigitFromChar(s[front]);
// Catch leading 0's
if(digit == 0 && result == 0) {
++front;
continue;
}
// Process 0-9 digits
else if(0 <= digit && digit <= 9) {
// Check for overflow
if(result > clamp) {
return (plus_minus == 1) ? INT_MAX : INT_MIN;
}
else if(result == clamp) {
if(plus_minus == 1 && digit >= 7) {
return INT_MAX;
}
else if(plus_minus == -1 && digit >= 8) {
return INT_MIN;
}
}
// Process if no overflow detected
result *= 10;
result += digit;
++front;
}
// Break on first non-digit char
else {
break;
}
}
return result * plus_minus;
}