[libft] ft_itoa
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
제대로 문자열로 변환되어 출력된 것을 확인할 수 있다.
의문점 및 생각해볼점
비트 논리연산자 |
우연히 찾아낸 방법이다.
‘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을 넣어주면 된다.