본문 바로가기
42Seoul/libft

ft_itoa

by 하고싶은건많은놈 2023. 2. 16.

itoa?

//원 함수 없음
    char *ft_itoa(int n);

구현해야할 함수 기능

: Allocates (with malloc(3)) and returns a string representing the integer received as an argument. Negative numbers must be handled.

해석 및 부연설명

: 정수 n을 입력받아 문자열로 반환한다. 음수도 처리되어야하며 할당 실패시엔 NULL을 반환한다.

ex)

printf("%s\n", ft_itoa(-12345));

코드 실행 결과

-12345

제대로 문자열로 변환되어 출력된 것을 확인할 수 있다.

의문점 및 생각해볼점

  1. 비트연산?

비트 논리연산자 |

우연히 찾아낸 방법이다.
'0'은 0011 0000이고, n % 10은 0000 0000부터 0000 1001까지라 비트 OR연산자인 '|'를 쓴 n % 10 | '0'의 값과 n % 10 + '0'의 값에는 아무런 차이가 없다.
비트 연산자는 속도 면에서 장점이 있다고 하니, 앞으로도 이런식으로 써먹을 수 있는 방법을 생각해보면 좋을 것 같다.


ft_itoa 구현

static int	cal_count(int n)
{
	int				count;
	unsigned int	temp;

	count = 0;
	if (n < 0)
	{
		temp = n * -1;
		count++;
	}
	else
		temp = n;
	if (temp == 0)
		count = 1;
	while (temp > 0)
	{
		temp /= 10;
		count++;
	}
	return (count);
}

static void	recur_cal(char *str, unsigned int n, int count)
{
	count--;
	if (n >= 10)
		recur_cal(str, n / 10, count);
	*(str + count) = n % 10 | '0';
}

char	*ft_itoa(int n)
{
	char	*str;
	int		count;

	count = cal_count(n);
	str = (char *)malloc((count + 1) * sizeof(char));
	if (!str)
		return (NULL);
	if (n < 0)
	{
		*str = '-';
		recur_cal(str, (unsigned int)(n * -1), count);
	}
	else
		recur_cal(str, n, count);
	*(str + count) = 0;
	return (str);
}

재귀함수를 통해 일의자리 수부터 채워놓도록 했는데, 그러기 위해선 전체 문자열의 길이를 먼저 구할 필요가 있다.
따라서 우선 cal_count 함수에서 자릿수를 세면서 주어진 수가 음수/0/양수일 때의 경우를 각각 나누어 처리한다. 이 때 int형 음수 최솟값인 -2147483648을 정삭적으로 나타내기 위해 unsigned int형을 활용했다.
그렇게 필요한 총 문자열의 길이를 구한 후 recur_cal 함수에서 재귀를 돌리며 문자를 채워넣는다. 그 후 마지막에 \0을 넣어주면 된다.

'42Seoul > libft' 카테고리의 다른 글

ft_strmapi  (0) 2023.02.16
ft_striteri  (0) 2023.02.16
ft_split  (0) 2023.02.16
ft_strtrim  (0) 2023.02.16
ft_strjoin  (0) 2023.02.16

댓글