%[플래그 : -0*+(공백)#][너비][.정밀도][길이수정자 : l ll h hh][서식지정자 : diuxXcsp%onfge]
#와 d 서식지정자는 함께 쓰면 정의되지 않은 결과를 내놓는다
ft_printf는 -Werror 옵션을 껐을 때의 기준으로 작성. 잘못된 조합을 넣어놔도 컴파일 가능
예외 처리 방식
예외로 처리할 게 아니라 출력 결과에 반영해주는 케이스
ex) -, 0 플래그 함께 쓸 때 : 0 무시 - 만 살림.
ex) +, 공백 플래그 함께 쓸 때 : +만 살림.
ex) 0 플래그와 s 서식지정자가 만날 때 : 0 플래그 반영
예외를 내가 알아서 처리해줘야 하는 케이스
undefined behavior(정의되지 않은 결과)를 유발하는 조합
-1을 반환하고 출력을 중단하거나 / 그냥 무시하고 출력을 진행하거나
테스터기와 뮬리넷은 저런 조합이 들어왔을 때 출력 결과를 검사하는 게 아니라
printf와 ft_printf의 반환값을 비교하는 것으로 보임.
ex) # 플래그와 d, i 서식지정자가 만날 때 : -1 반환하고 ft_printf 종료
ex) + 나 공백 플래그와 o, x, X 서식지정자가 만날 때 : -1 반환하고 ft_printf 종료
ex) + 나 공백, # 플래그와 s 서식지정자가 만날 때 : -1 반환하고 ft_printf 종료
ex) h, hh 길이수정자와 f, g, e 서식지정자가 만날 때 : -1 반환하고 ft_printf 종료
이런 예시들은 직접 printf로 실험하며 파악하는 걸 추천한다.. 경우의 수가 워낙 많음
형식 문자열 (format)
int ft_printf(const char *format, ...)
표준 출력(stdout)에 일련의 데이터들을 형식문자열(format)에 지정되어 있는 형태로 출력
서식지정자 (format specifier)
ft_printf의 유일한 고정인수 format은 서식문자열/형식문자열/포맷 이라고 불림
이 문자열 안에는 %로 시작하는 서식지정자가 존재.
이 서식지정자에 다양한 플래그, 폭, 정밀도, 길이 등의 옵션을 조합해서 사용
형식태그 (format tag)
서식지정자에 옵션을 추가하려면 형식 태그(format tag)의 형태를 지켜야 함
%[flag][width][.precision]서식지정자
ft_printf의 가변인자 ... 에 들어오는 인자가 형식태그가 지정한 형태로 치환되어 출력되는 매커니즘
ex) %문자를 출력해야한다면 → %%
플래그 (flag) - 여러개 동시 사용 가능
ex) int num = 7; printf("%*d", 5, num) → ____7 (정수 포함해서 다섯칸의 너비)
ex) int num = 7; pritnf("%0*d", 5, num) → 00007
폭 (width)
출력할 값의 최소 너비(폭)
출력값이 지정한 폭보다 작으면 남는 자리를 공백/0으로 채운다
출력값이 지정한 폭보다 크면 width옵션은 무시
width에 음수가 할당되면 - 플래그 (좌측 정렬) + width (폭) 으로 간주한다.
ex) int num = 7; printf("%3d", num) → __7
ex) int num = 7; printf("%*d”, 3, num) → __7
ex) int num = 7; printf("%-3d", num) →7__
ex) int num = 7; printf("%*d, -3, num) → 7__
정밀도 (precision)
출력할 값의 자릿수를 설정(몇 자리까지 출력해야 되냐~). 정확도를 위해
정밀도에 음수가 할당되면 무시.
앞에 마침표(.)를 찍는다. 폭과 구분하기 위해
출력값 정수(d, i)일 때 :
최대 자릿수를 맞추기 위해 0추가. 자릿수 < 출력값 일시 정밀도 옵션 무시
ex) int num = 77; printf("%.5d", num) → 00077
ex) int num = 7777; printf("%.2d", num) → 7777
출력값 실수(f)일 때 :
소수점 이하 최대 자릿수를 지정. 실수 전체의 자릿수 설정은 width옵션으로 지정.
자릿수에 따라 반올림 or 소수점 이하에 0 추가
서식지정자 (type)
가변 인자 함수
승민 언니 강의록