728x90
반응형

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);
}

 

github.com/kimjinho1/Libft

 

kimjinho1/Libft

42 Seoul Libft. Contribute to kimjinho1/Libft development by creating an account on GitHub.

github.com

 

728x90
반응형

+ Recent posts