[42cursus/ft_printf] ft_printf 정리
- 프로토타입
int ft_printf(const char *format, ...)
- 형식 구조
%[플래그][폭][.정밀도]서식지정자
(앞으로 폭은 width, 정밀도는 precision이라고 칭한다, [플래그][폭][.정밀도]를 합쳐서 플래그라고 칭할 수도 있다.)
- 기본 서식 지정자
* mandatory : cspdiuxX%
%c | 문자 |
%s | 문자열 |
%p | 포인터의 메모리 주소, 리눅스, OS X에서는 앞에 0x가 붙고, A~F는 소문자로 출력, 높은 자릿수의 0은 생략 |
%d | 부호가 있는 10진 정수 |
%i | 부호가 있는 10진 정수 |
%u | 부호가 없는 10진 정수 |
%x | 부호가 없는 16진 정수(소문자) |
%X | 부호가 없는 16진 정수(대문자) |
%% | %기호 출력 |
- 플래그
* mandatory : -0.*
- | 왼쪽 정렬 |
0 | 출력하는 폭의 남는 공간에 0으로 채움, '-'플래그와 동시 사용 불가, '-'플래그의 우선순위가 더 높음 |
. | '.'뒤에 나오는 숫자가 precision, precision은 출력되는 숫자의 최소길이(%s에서는 최대길이) |
* | width자리나 precision자리에 들어가서 wildcard로 쓰임, va_arg(ap, int)를 통해 입력해준 값 받아옴 |
- ft_printf 구현 순서(추천)
형식구조 이해 => width, precision, 플래그 파싱 =>
형식 지정자마다의 width/precision/strlen 관계 정리 => (width)%csdiuxXp 순서로 구현
이 순서를 추천하는 이유
형식구조를 이해하면 플래그 => width => precision 순서로 나오는 것을 알게 된다. 이에 맞춰서 파싱해준다. (init 필수)
제대로 파싱되었는지 확인해보고 그다음 각 형식 지정자 마다 width/precision/strlen의 관계를 알아본다. diuxXp에서 관계는 비슷하다. s에서 특이하다.
(width)%csdiuxXp 순서로 구현하는 이유:
width는 계속해서 쓰인다. %는 간단하다. c도 간단하다. s도 precision을 고려해야되지만 간단한 편이다.
int형(d == i) 먼저 구현하면 다른 숫자들도 어느정도 틀이 비슷하기 때문에 int 먼저 구현한다.
unsigned int는 int와 같은 10진수, int에서 조금만 바꾸면 되니까 그다음에 구현한다.
16진수 hexadecimal (x, X)는 x를 만들고 거기에 ft_toupper로 X를 구현하는게 좋다.
소문자로 출력되면 pointer출력에 편하다.
- width/precision/strlen의 관계 (숫자에서)
width : 출력되는 최소 길이 (부호, 숫자, precision 포함)
precision : 숫자의 최소 길이 (부호 미포함)
strlen : 숫자의 길이(부호 미포함)
- Test tool
mandatory만 가능 + 형식 지정자 별로 확인 가능 + 제일 느슨한 테스트 툴 (이걸 먼저 돌려보기)
bonus까지 확인 가능 + 형식 지정자 별로 확인 가능+undefined 테스트가 많음
github.com/charMstr/printf_lover_v2
bonus까지 확인 가능 + 형식 지정자 별로 확인 가능 + 다른 테스트 툴 통과해도 이거 통과 못하면 KO 뜨는 경우 있다고함
github.com/Mazoise/42TESTERS-PRINTF
mandatory만 가능 + 형식 지정자를 섞어서 테스트하는게 많아서 모두 구현하고 마지막에 돌려보는게 나음