구현한 ft_printf에서 %x, %X, %p, %% 출력의 구현부
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);
}
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);
}
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);
}