Main Function
•
pseudo code
int ft_printf(const char *foramt, ...)
{
va_list ap;
int p_len;
va_start(ap, format)
가변인자의 길이를 계산하고, 한 변수(p_len)에 저장함
va_end(ap)
if p_len이 -1이면 return (-1)
return (p_len)
}
C
복사
•
코드 설명 (위에서 부터 아래로)
1.
처음에 va_list(typedef char *) 타입의 포인터 변수(→ap)를 생성해 줍니다.
2.
va_start 함수를 통해 ap가 가변 인자 첫 번째 주소를 가리키도록 해줍니다.
3.
core 부분 함수가 들어갈 예정인데, printf로 출력되는 총 길이를 p_len 변수에 받습니다.
4.
va_end 함수를 통해 ap 포인터를 NULL로 다시 설정해 줍니다.
5.
p_len의 길이가 -1이면 에러가 발생한 것이므로 return (-1)을 해줍니다.
6.
위 작업들이 끝난 경우 p_len을 리턴해 줍니다.
Core Function
•
pseudo code
static int ft_printf_core(const char *format, va_list ap)
{
while(널('\0') 만날때 까지)
{
if '%'를 만나면
{
while (널('\0') 만날때 까지 && !istype()) //istype : 타입인지 체크
{
format_parsing()
rd_size += tycheck()
}
else // 안 만나면
한 글자 출력 !
rd_size += 1;
}
}
}
C
복사
•
코드 설명
1. %를 만난 후 istype 조건을 while문 안에 넣은 이유
→
#include <stdio.h>
int main()
{
printf("%vvvvv");
}
C
복사
위의 코드를 실제로 출력해보면 warning이 발생하며 아무것도 출력되지 않습니다.
따라서 valid한 값들을 검사하는 것이 아니라 %를 발견한 순간 부터 type이 나올 때 까지 while문을 돌려야 한다는 사실을 알 수 있었습니다.
%c
void c_printf(t_point *pt, int ch);
C++
복사
%s
int s_printf(t_point *pt, char *s);
C++
복사
%p
int p_printf(t_point *pt, unsigned long long p);
C++
복사
•
width
영향 없음
•
precision
영향 없음
앞에 0x 붙여서 출력함.
%d
C++
복사
%i
C++
복사
%u
C++
복사
%x
C++
복사
%X
C++
복사