뇌 마음 반반저장소

[42_libft] Part 2 (itoa) 본문

42/libft

[42_libft] Part 2 (itoa)

맹진저 2022. 12. 13. 20:23
728x90

 1-5. ft_itoa

itoa란?

Parameters : 매개 변수
n: the integer to convert.
n: 변환할 정수입니다.

Return value : 반환 값
The string representing the integer. NULL if the allocation fails.
정수를 나타내는 문자열입니다. 할당에 실패하면 NULL입니다.

External functs. : 외부 기능
malloc

Description : 설명
Allocates (with malloc(3)) and returns a string representing the integer received as an argument. Negative numbers must be handled.
malloc(3)을 사용하여 할당하고 인수로 받은 정수를 나타내는 문자열을 반환합니다. 음수는 처리해야 합니다.

함수 선언 원형

char	*ft_itoa(int n);

이 함수는 원형에서 보듯이 정수를 문자로 바꿔주는 기능이다. 음수는 처리해야 된다는 게 무슨 말이냐. (깡패냐 깡패)

 

일단 문자를 변환할때 int사이즈의 n을 long long사이즈의 nb로 변환해야 한다. 그 이유는!

int의 MIN 사이즈는 -2147483648 이다. 하지만 실제로 유효한 숫자는 여기서 -1을 뺀 숫자다. 그래서 INT_MIN도 숫자로 구현하고 싶다면 int보다 사이즈 범위가 높은 long long을 사용해 주어야 한다. 

 

 1. 먼저 이 숫자가 몇 개로 이루어졌는지 구한다. 

atoi에서 10을 나눠준 것처럼 10으로 계속 나누면서 숫자를 구한다. 단 음수는 일단 건너뛰고!

int		ft_nbrlen(long nb)
{
	int		len;

	len = 0;
	if (nb < 0)
	{
		nb *= -1;
		len++;
	}
	while (nb > 0)
	{
		nb /= 10;
		len++;
	}
	return (len);
}

 2. 구한 크기와 마지막 널문자를 계산해서 힙 영역에 동적 할당을 해주고,

	i = ft_nbrlen(n);
	if (!(str = (char*)malloc(sizeof(char) * (i + 1))))
    		return (NULL);
    	str[i--] = '\0';

 3. 만약에 숫자가 0이면 바로 0 문자로 리턴해주고

	if (n == 0)
	{
		str[0] = '0';
		return (str);
	}

 4. 만약 음수라면 첫 번째에 -를 써준다.

	if (n < 0)
	{
		str[0] = '-';
		n *= -1;
	}

 5. 그리고 마지막 숫자부터 숫자를 차례로 넣어준다.

	while (n > 0) // n이 365라면,
	{
		str[i] = (n % 10) + '0'; //5를 먼저 i에 쓰고
		n /= 10; //n은 36이된다. 
		i--; //i는 앞으로 자리를 땡긴다. 
	} // 5 i-- 6 i-- 3 i-- => 365!

 

!테스트 메인!

int main()
{
	printf("%s\n", ft_itoa(-789));
	return 0;
}

사용한 함수

1. 숫자의 길이를 구하기 위한 함수

2. 영역을 할당해주기 위한 malloc

 

!테스트 결과!

-789

 

 

수정 : ft_pritnf 중에 itoa를 구현하며 2022.12.16

 

도움을 주고 싶으신 내용이나

틀린 내용이 있다면 댓글로 남겨주시고,

참고하신다면 꼭 출처를 밝혀주세요!

 

도움이 되었다면 공감 한 번씩 부탁드립니다❤️

728x90
Comments