[ft_printf] 구현

J_JEON·2022년 4월 22일
0

ft_printf

목록 보기
2/5

ft_printf의 기능중 csdiupxX% 만을 구현한 함수

ft_printf(const char* str, ...)

int	ft_printf(const char *str, ...)
{
	va_list	a; //가변인자들을 저장하기위한 저장공간
	int		i; //문자열을 순회하기위한 인덱스
	ssize_t	print_size; //지금까지 출력한 문자의 수
	ssize_t	past_print_size; //이전까지 출력한 문자의 수

	i = 0;
	print_size = 0;
	va_start (a, str); //va_list를 str의 저장공간을 기점으로 초기화
	while (str[i]) //str문자열에 문자가 존재하는동안
	{
		past_print_size = print_size; //이전의 출력값을 현재 출력값으로
		if (str[i] != '%') //현재 보고있는 문자가 %가 아니라면
			print_size += write(1, &str[i], 1); //현재 보고있는 문자열을 출력
		else // 현재 보고있는 문자가 %라면
			print_size += print_va(&str[i++], &a);
            //print_va함수 호출 하고 인덱스값 증가
		if (past_print_size > print_size)
        //이전에 출력한 문자의 수가 현재 출력한 문자수보다 많다는것은 에러가 발생한것
		{
			print_size = -1;
			va_end(a); //va_list를 NULL로 비워줌
			return (print_size); //오류가 발생했다는 뜻인 -1 리턴
		}
		i++; //인덱스값을 증가시켜 다음 문자를 보게 함
	}
	va_end(a); // va_list를 NULL로 비워줌
	return ((int)print_size); //출력한 문자의 수를 반환
}

print_va(const char str, va_list a)

ssize_t	print_va(const char *str, va_list *a)
{
	ssize_t	print_size; //출력한 크기를 저장할 ssize_t

	print_size = 0;
	if (str[1] == 'c') //% 이후의 문자가 c라면 ft_print_c 호출
		print_size = ft_print_c(&a);
	else if (str[1] == 's') //% 이후의 문자가 s라면 ft_print_s 호출
		print_size = ft_print_s(&a);
	else if (str[1] == 'd') //% 이후의 문자가 d라면 ft_print_d 호출
		print_size = ft_print_d(&a);
	else if (str[1] == 'i') //...
		print_size = ft_print_i(&a);
	else if (str[1] == 'u')
		print_size = ft_print_u(&a);
	else if (str[1] == '%') //%이후 문자가 %라면 문자 %를 출력
		print_size = write(1, "%%", 1);
	else if (str[1] == 'x')
		print_size = ft_print_sx(&a);
	else if (str[1] == 'X')
		print_size = ft_print_bx(&a);
	else if (str[1] == 'p')
		print_size = ft_print_p(&a);
	return (print_size); //출력한 크기를 반환
}
profile
늅늅

0개의 댓글