//////
Search
Duplicate
📗

구조 잡기

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++
복사