구현할 서식지정자
%c: 하나의 문자를 출력
%s: 문자열을 출력
%d, %i: 정수(음수 포함)를 출력
%u: 부호 없는 정수 출력
%x, %X: 16진수 출력(소문자/대문자 구분)
%p: 포인터 주소 출력
%%: 문자 % 출력
printf 흐름
1_1. 고정 인자와 가변 인자
- 고정 인자: 형식 문자열에서 매개변수 개수, 문자는 고정
- 가변 인자: %s, %d 등 형식 지정자 뒤의 인자들, 가변적으로 개수가 달라짐
1_2. 형식 지정자 처리
- %를 만났을 때 -> 그 다음 글자가 형식 지정자라면, 해당 타입에 맞게 인자 하나를 출력함.
- 출력되는 값은 형식 지정자에 따라 달라진다.
- %s -> 문자열
- %d, %i -> 정수
- %p -> 포인터 주소
1_3. 함수 흐름
- va_list 초기화 va_start(args, format)
- 문자열을 하나씩 읽으면서 %를 만나면 형식 지정자 처리
- 인자를 적절하게 꺼내어 형식에 맞게 출력
- 출력 후, 가변 인자 처리를 종료: va_end(args)
2. 출력 결과를 구하는 방식
2_1. write 사용
write()를 사용하여 표준 출력(stdout, fd = 1)에 직접 출력한다.
- write(fd, buf, size) -> fd는 파일 디스크립터, buf는 출력할 데이터, size는 출력 할 데이터의 크기다.
- 출력된 문자의 수느 ft_printf가 반환한다.
2_2. 리턴값
ft_printf는 출력된 문자의 수를 반환한다.
(이는 printf 함수의 표준 규격에 맞추기 위함이다.)
예외 및 특수 처리
3_1. 문자 처리
%c에서 출력되는 문자는 반드시 하나여야 한다는 제약이 있다.
- write에서 1개의 문자만 출력한다.
3_2. 인자 타입 불일치
- 형식 지정자와 인자 타입이 일치하지 않으면 정의되지 않은 동작이 발생할 수 있다.
- 예시: %d에 문자를 전달하면 출력되지 않거나 세그폴트가 발생할 수 있다.