ft_atoi: 문자열을 정수로 바꿔주는 함수
ex) ft_atoi(" -1234") = -1234
구현 과정은 간단하게 3가지로 설명 가능할 것 같다.
1) 입력으로 주어진 문자열에서 앞부분 공백들을 모두 넘어가야 함
2) 공백을 전부 넘어간 다음에 - or + 가 있다면 다음칸으로 넘어감. 만약 - 였다면 sign 변수를 1에서 -1로 바꾼다
3) 0~9 이외의 문자가 나올 때까지 숫자를 계속 업데이트함(n = 10*n + nptr[i])
업데이트 중에 숫자가 int 타입의 범위를 넘어버리는 경우는 따로 처리를 해줘야 한다(while 문 안에 if, else if 문)
int ft_atoi(const char *nptr)
{
int i;
int sign;
long long n;
i = 0;
sign = 1;
n = 0;
while (nptr[i] == ' ' || nptr[i] == '\n' || nptr[i] == '\t' ||
nptr[i] == '\v' || nptr[i] == '\f' || nptr[i] == '\r')
i++;
if (nptr[i] == '-')
sign *= -1;
if (nptr[i] == '-' || nptr[i] == '+')
i++;
while (nptr[i] && nptr[i] >= '0' && nptr[i] <= '9')
{
if (n * sign > 2147483647)
return (-1);
else if (n * sign < -2147483648)
return (0);
else
n = n * 10 + (nptr[i] - '0');
i++;
}
return (n * sign);
}
ft_itoa: 정수를 문자열로 바꿔주는 함수
atoi의 반대 버전이지만 구현하는 데 아주 조금 힘이 더 든다. 포인트는 배열의 뒷부분부터 채운다는 점인데
ex) n = 123이면 [][][] -> [][][3] -> [][2][3] -> [1][2][3]과 같은 방식으로 문자열에 채워진다.
입력이 음수일 때는 맨 앞에 '-'가 들어가야 하므로 기본 문자열보다 1개 큰 문자열을 할당해줘야 하고 숫자를 채울 때도 주의해줘야 한다.
ex) n = -123이면 [][][][] -> [-][][][] -> [-][][][3] -> [-][][2][3]-> [-][1][2][3]
long long ft_abs(int n)
{
long long n2;
n2 = n;
if (n < 0)
return (n2 * -1);
return (n2);
}
int ft_intlen(int n)
{
int len;
long long n2;
len = 1;
n2 = ft_abs(n);
while (n2 /= 10)
len++;
return (len);
}
char *ft_itoa(int n)
{
char *str;
long long n2;
int i;
int len;
n2 = ft_abs(n);
i = 1;
len = ft_intlen(n);
if (n < 0)
len++;
if (!(str = (char *)malloc(sizeof(char) * (len + 1))))
return (NULL);
if (n < 0)
str[0] = '-';
while (i <= len)
{
if (str[len - i] != '-')
str[len - i] = (n2 % 10) + '0';
n2 /= 10;
i++;
}
str[len] = '\0';
return (str);
}
kimjinho1/Libft
42 Seoul Libft. Contribute to kimjinho1/Libft development by creating an account on GitHub.
github.com
'42 SEOUL > Libft' 카테고리의 다른 글
42 서울 Libft(ft_putchar_fd, ft_putstr_fd, ft_putendl_fd, ft_putnbr_fd) (0) | 2021.01.25 |
---|---|
42 서울 Libft(ft_memcpy, ft_memccpy, ft_memchr, ft_memcmp, ft_memmove) (0) | 2021.01.24 |
42 서울 Libft(ft_split) (0) | 2020.12.19 |
42 서울 Libft(ft_isalpha, ft_isdigit, ft_isalnum, ft_isascii, ft_isprint) (0) | 2020.12.19 |
42 서울 Libft(ft_bzero, ft_memset, ft_calloc) (0) | 2020.12.19 |