-
Notifications
You must be signed in to change notification settings - Fork 0
/
43_real_atoi.c
107 lines (87 loc) · 2.65 KB
/
43_real_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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
Write the function ft_real_atoi that takes a string as an argument
It will reproduce the exact behavious of the <stdlib.h> function atoi
The function must be prototyped as follows: int ft_real_atoi(char *str);
The function must return the corresponding integer representation of its string argument
There is no restrictions on its argument, but in order to be converted the string will be formatted as follows:
[spaces][sign][digits][any non digits][anything] where:
- [spaces] is any amount of spaces (spaces being defined as in isspace function)
- [sign] is either a '+' or a '-' character (will not always be present)
- [digits] is any amount of digits
- [any non digits] is any amount of non digits
- [anything] is any amount of any characters
For example these are all possible arguments:
" \t-124a64"
"\r+000000\v"
"632"
"\f \f"
"1000000000000000000000"
"-1000000000000000000000"
"abc18"
"+4294967296"
"+-+-+-+-+-1234567890+-+-+-+-+-"
If its argument is a null pointer, it must return 0
The overflows must work as in real atoi function
Examples: You can use the real atoi function to see how it interacts with different arguments
Allowed functions: none
*/
#include <stdio.h>
int ft_isspace(char c)
{
if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '\f')
{
return (1);
}
return (0);
}
int ft_real_atoi(char *str)
{
int i;
int sign;
int res;
i = 0;
sign = 1;
res = 0;
if (str == NULL)
{
return (0);
}
else
{
while ((ft_isspace(str[i]) == 1))
{
i++;
}
if (str[0] == '-')
{
sign = -1;
i++;
}
if (str[0] == '+')
{
i++;
}
while ((str[i] >= '0' && str[i] <= '9') && str[i] != '\0') // while less then 57 and more then 48 (all digest)
{
res = res * 10 + (str[i] - '0');
i++;
}
return (sign * res);
}
}
/*
int main()
{
printf("%d\n", ft_real_atoi(NULL));
printf("%d\n", ft_real_atoi("\t-124a64"));
printf("%d\n", ft_real_atoi("+632"));
printf("%d\n", ft_real_atoi("-123\n85"));
printf("%d\n", ft_real_atoi("\f \f"));
printf("%d\n", ft_real_atoi("1000000000000000000000")); // out of range should return (-1)
printf("%d\n", ft_real_atoi("-1000000000000000000000")); // out of range should return (-1)
printf("%d\n", ft_real_atoi("abc18"));
printf("%d\n", ft_real_atoi("4294967296"));
printf("%d\n", ft_real_atoi("+-+-+-+-+-1234567890+-+-+-+-+-"));
return (0);
}
*/