📌 매뉴얼 (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 |