ft_printf & util 구현

이미리·2022년 6월 27일
0

1. printf 구현

ft_printf 함수 구현

int ft_printf(const char *format, ...) 는 format을 인자로 받아 while문을 통해 한글자씩 돌리면서 '%'가 나오면 파싱한다.

이때 % 다음에 오는 것이 '\0' 문자라면 파싱하지 않고 넘어간다.

parsing 함수 구현

int ft_parser(char format, va_list ap)는 % 뒤에 나온 문자을 char c를 통해 받아서 파싱한다.

int	ft_parser(char format, va_list ap)
{
	if (format == 'd' || format == 'i')
		return (ft_printf_di(va_arg(ap, int)));
	else if (format == 'u')
		return (ft_printf_u(va_arg(ap, int)));
	else if (format == 'c')
		return (ft_putchar(va_arg(ap, int)));
	else if (format == 's')
		return (ft_putstr(va_arg(ap, char *)));
	else if (format == 'p')
		return (ft_printf_p(va_arg(ap, unsigned long)));
	else if (format == 'x' || format == 'X')
		return (ft_put_hex(va_arg(ap, unsigned int), c));
	else
		return (ft_putchar('%'));
}
  • d & i option
    d & i option의 차이는 이전의 글에서 설명했듯, d의 경우는 10진수만을 받아 표현할 수 있고, i의 경우 8, 10, 16진수가 가능하다. 따라서 유의미한 차이는 입력을 받는 함수인 scanf에서 나온다.
  • x & X option
    x & X option의 차이는 16진수를 출력할 때 a~f, A~F 부분을 나타내는데에 있다. x의 경우 소문자를, X의 경우 대문자를 출력시키는데 이러한 차이는 이후 설명되는 util 함수에서 어떻게 처리하였는지 설명하겠다.

2. util 구현

ft_putchar & ft_putstr 함수 구현

int ft_putchar(char c)의 경우 생략하겠다.
int ft_putstr(char *str)의 경우는 이전에 사용했던 그대로의 원형에서 들어온 입력값이 없을 시에 (null)을 출력하도록 했다.

ft_printf_di 함수 구현

int ft_printf_di(long long n)는 10진수 signed int를 처리하는 함수이다. 부호가 존재한다는 뜻이다. 음수의 경우에 조건문을 통해서 따로 처리해주었다.

나머지는 signed int의 MAX 값인 2147483647을 기준점 잡아 처리해주었다.
n이 -2147483648인 경우 조건문에 들어가서 음수 처리가 되는데, 이때 2147483648이 된다. 이때 출력이 제대로 되어야하므로 이 또한 조건문으로 처리를 해준다. (매개변수를 long long으로 받는 이유이다.)

ft_printf_u 함수 구현

int ft_printf_u(unsigned int n)는 10진수 unsigned int를 처리하는 함수이다. 이는 ft_printf_di를 했던 방식과 상당히 유사하다. 오히려 음수를 처리할 필요가 없으니 더 간단하다.

ft_printf_p 함수 구현

int ft_printf_p(uintptr_t n)는 포인터가 참조하고 있는 메모리의 주소 값 (8자리의 16진수)을 출력해준다.

때문에 unsigned long으로 처리해주게 되는데 이는 unsigned long의 크기가 8byte이기 때문이다.

이것을 설명하려면 바이트 어드레싱 & 바이트 패딩에 대해 알아야한다.

ft_printf_hex 함수 구현

int ft_put_hex(unsigned int n, char format)는 format x & X를 처리해주는 함수이다. 16진수의 형태로 출력을 한다.

hex = "0123456789ABCDEF";
if (format == 'x')
	hex = "0123456789abcdef";

이렇게 조건문을 통해 베이스처리를 해주었다. (덮어쓰기인셈.)
위의 10진수를 출력하는 함수들과 유사하게 처리하였다. (재귀)

0개의 댓글