본문 바로가기

프로그래밍/C

[library] itoa 구현하기

📌 매뉴얼 (in subject)

더보기

Function name

     do_itoa

 

Prototype

    char *do_itoa(int n);

 

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을 사용하여 할당하고 인수로 받은 정수를 나타내는 문자열을 반환. 음수 처리해야 함.

 

📌 작성 코드

static void	do_negative(int *n, char **str)
{
	if ((*n) < 0 && *n != -2147483648)
	{
		(*str)[0] = '-';
		(*n) = (*n) * (-1);
	}
	if ((*n) == -2147483648)
	{
		(*str)[0] = '-';
		(*str)[1] = '2';
		(*n) = 147483648;
	}
}

static int	do_digit(int n, int *minus)
{
	int	d;

	d = 1;
	if (n == -2147483648)
	{
		*minus = 2;
		d = 9;
		return (d);
	}
	if (n < 0)
	{
		n = n * (-1);
		*minus = 1;
	}
	else
		*minus = 0;
	while (n >= 10)
	{
		n = n / 10;
		d ++;
	}
	return (d);
}

char	*do_itoa(int n)
{
	char	*str;
	int		minus;
	int		i;
	int		digit;
	int		nb;

	i = 1;
	digit = do_digit(n, &minus);
	str = (char *)malloc(sizeof(char) * (digit + minus + 1));
	if (str == NULL)
		return (NULL);
	do_negative(&n, &str);
	while (i <= digit)
	{
		nb = n % 10 + 48;
		n = n / 10;
		str[digit + minus - i] = nb;
		i ++;
	}
	str [digit + minus] = '\0';
	return (str);
}

 

📌 코드 리뷰

itoa 함수는 int to alphabet 으로, 정수로 받은 인자를 문자열 형태로 변환하여 반환해주는 함수이다.

예시로 12345라는 정수를 받으면, "12345"의 형태를 가지는 문자열을 반환받는 것이다.

 

> 예외적으로 고려해야할 사항

1. 최솟값인 -2147483648 의 예외 ( * (-1) 을 하면 overflow 되므로 처리 필요)

2. 음수 처리 (- 부호 붙이기)

 

일단, 자릿수가 필요하다.

do_digit 함수가 자릿수를 구하는 역할을 하게 되는데, 일단 위에서 언급한 예외적인 최솟값을 먼저 처리한다.

minus라는 변수를 사용하는데, 이는 음수의 '-' 부호를 붙힐 자리를 마련하기 위한 역할으로,

0 이면 양의 정수 / 1이면 일반 음의 정수 / 2이면 최솟값이 된다.

 

최솟값의 minus 변수값이 2가 되는 것은 -2147483648 에서, 앞의 '-2' 공간을 각각 대입하고,

나머지 '147483648'을 다른 정수처럼 처리하기 위해 -와 2의 공간을 마련하는 것으로 활용했다.

 

그리하여 최솟값은 자릿수 d : 9 , minus : 2 인 상태로 return 될 것이고,

그 외에, 음수이면 -1을 곱해 양의 정수로 만들고, minus : 1, 양수이면 minus : 0 으로 만들고 넘어간다.

 

그 후엔 10씩 나눠서 자릿수를 계산하여 return 하고, 다시 do_itoa 함수로 돌아온다.

그리하여, 구한 digit + minus 에 '\0' 자리를 하나 더해 동적할당해준다.

 

다음은 do_negative 함수가 실행된다.

이 함수는 음수는 문자열의 0번째를 '-'를 넣어주고, 음수를 양수로 바꾸는 과정을 취하고,

최솟값은 문자열 0번째에 '-', 1번째에 '2'를 넣은 뒤, 남은 숫자를 '1473648'인 처리가능한 숫자로 만들어준다.

 

이후는 반복문이다. 

10으로 나눈 나머지에 48(= '0') 을 더한 값을 nb에 넣어주는데, 이는 가장 낮은 자릿수의 숫자를 문자화한 것이다.

남은 숫자들을 처리하기위해 n을 10으로 나눠서 n에 다시 적용시켜주고,

str[digit + minus - i] 부터 차례대로 뒤에서부터 nb로 채운다. 

그럼 우리가 원하는 정수를 문자열로 바꾼 str이 만들어진다.

 

 

 

 

+) 최솟값 처리가 투박하게 만들어진 점이 조금 아쉬운데, 다른 방법이 있는지 고민해볼 필요가 있다.

'프로그래밍 > C' 카테고리의 다른 글

[utility] get_next_line 구현하기  (3) 2024.08.31
[graphic] miniLibX Manual  (0) 2024.08.06
[library] split 구현하기  (0) 2024.06.29
[library] strtrim 구현하기  (0) 2024.06.27
[library] strjoin 구현하기  (0) 2024.06.26
Recent Posts
Popular Posts
Recent Comments