[ft_printf] (%x, %X, %p, %%)

J_JEON·2022년 4월 25일
0

ft_printf

목록 보기
5/5

구현한 ft_printf에서 %x, %X, %p, %% 출력의 구현부

16진수를 소문자로 출력하는 %x

ssize_t	ft_print_sx(va_list **a)
{
	unsigned int	vatemp; //가변인자에서 읽어온 데이터를 저장할 변수
	ssize_t			print_size;
	char			*str; //16진수로 변환한 뒤 문자열로 저장해줄 저장공간

	print_size = 0;
	vatemp = (unsigned int)va_arg(**a, unsigned int);
    //가변인자에서 unsigned int크기만큼 읽어옴
	if (vatemp == 0) //읽어온 값이 만약 0이라면 0을 출력하고 종료
		return (write(1, "0", 1));
	str = ft_change_hexa((long long)vatemp, 1);
     //값을 16진수로 변환하고 문자열로 반환하는 ft_change_hexa에 
     //long long으로 형변환 해주고 넣어줌
	print_size = write(1, str, ft_strlen(str));
     //문자열을 출력해주고 출력크기를 저장해줌
	free(str); //출력 후 메모리 누수를 방지하기위해 free
	return (print_size);
}

16진수를 대문자로 출력하는 %X

ssize_t	ft_print_bx(va_list **a)
{
	unsigned int	vatemp; //가변인자에서 읽어온 데이터를 저장할 변수
	int				i;
	ssize_t			print_size;
	char			*str; //16진수로 변환한 뒤 문자열로 저장해줄 저장공간

	i = 0;
	print_size = 0;
	vatemp = (unsigned int)va_arg(**a, unsigned int);
    //가변인자에서 unsigned int크기만큼 읽어옴
	if (vatemp == 0) //읽어온 값이 만약 0이라면 0을 출력하고 종료
		return (write(1, "0", 1));
	str = ft_change_hexa((long long)vatemp, 1);
     //값을 16진수로 변환하고 문자열로 반환하는 ft_change_hexa에 
     //long long으로 형변환 해주고 넣어줌
	while (str[i] != '\0') //문자열이 끝날때까지 반복
	{
		if (str[i] >= 97 && str[i] <= 122) //문자가 소문자라면
			str[i] -= 32; //대문자로 바꿔줌
		i++;
	}
	print_size = write(1, str, ft_strlen(str)); //문자열 출력
	free(str); //메모리 누수 방지위해 free
	return (print_size);
}

주소를 16진수로 출력하는 %p

ssize_t	ft_print_p(va_list **a)
{
	size_t	vatemp; //가변인자에서 읽어온 데이터를 저장할 변수
	ssize_t	print_size;
	char	*str; //16진수로 변환한 뒤 문자열로 저장해줄 공간

	print_size = 0;
	vatemp = (size_t)va_arg(**a, size_t);
    //가변인자에서 size_t만큼 읽어옴
	if (vatemp == 0)
		return (write(1, "0x0", 3));
    //읽어온 값이 0일시 0x0을 출력하고 종료
	str = ft_change_hexa_address((size_t)vatemp);
    //값을 주소의 형태로 변환하고 문자열로 반환하는 ft_change_hexa_address에 넣어줌
	print_size = write(1, "0x", 2);
    //주소를 출력하기때문에 먼저 0x를 출력
	if (print_size == -1) //오류로 출력에 실패할시 종료
		return (print_size);
	print_size = write(1, str, ft_strlen(str));
    //문자열을 출력
	if (print_size == -1) //오류로 출력에 실패할 시 종료
		return (print_size);
	free(str); //메모리 누수 방지를 위해 free
	return (print_size + 2);
}

%를 출력하는 %%

ssize_t	print_va(const char *str, va_list *a)
{
	ssize_t	print_size;

	print_size = 0;
	if (str[1] == 'c')
		print_size = ft_print_c(&a);
...
	else if (str[1] == '%') // 문자열 순회중 %다음에 또 %가 나왔다면
		print_size = write(1, "%%", 1); //%를 출력하고 1을 반환 할 값으로 줌
...
	return (print_size);
}
profile
늅늅

0개의 댓글