Search
Duplicate
😊

ft_printf 보너스까지 해보자(*^▽^*)

간단소개
ft_printf 재밌어요! (나만 고통받을 수 없어… 후후후…)
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
과제
Scrap
태그
ft_printf
9 more properties

printf란 무엇인가?

printf()란 결과물을 표준 출력으로 츨력하는 함수입니다. 함수 실행에 성공했을 경우, 출력한 결과물의 길이를 반환하고 실패했을 경우 음수를 반환합니다.

구현

int ft_print(const char *, ...)

Syntax

printf()
%[$][flags][width][.precision][length modifier]conversion
C
복사
ft_printf()
%[flags][width][.precision]conversion
C
복사
NOTE: ft_printf() do not implement the buffer management of the original printf(). It only handles cspdiuxX% conversions.
원본 printf는 버퍼 매니지먼트를 해야 하나 우리의 ft_printf는 하면 안됩니다. 버퍼 매니먼트가 무언인지 궁금하신 분은 여기로.

규칙

우선 이 과제를 진행하면서 가장 어려운 점은 바로 규칙 찾기입니다.
flag 하나의 결과물은 예상하기 쉬운데, 다른 flag와 중첩되거나 precision 또는 width와 같이 사용되면 결과물이 예측하기 어렵습니다. 실은 답은… 하나하나 찍어보는 수밖에 없지요.
그런 어려움을 조금 줄여보고자 실은 더 많은 사람들이 printf과제를 하게 만들려고 제가 공부한 것들을 한번 공유해보고자 합니다.
flag
%c
%s
%p
%d
%i
%u
%x
%X
%%
width
O
O
O
O
O
O
O
O
O
precision
X
O
X
O
O
O
O
O
X
-
O
O
O
O
O
O
O
O
O
0
X
X
X
O
O
O
O
O
O
#
X
X
X
X
X
X
O
O
X
space
X
X
X
O
O
X
X
X
X
+
X
X
X
O
O
X
X
X
X
Width > Precision
diuxX
precision은 무시되고, width만큼 칸에 채워넣고 남은 칸에는 공백이 채워진다.
#include <stdio.h> int main(void) { printf("%3.d\n", 10); // ' 10' printf("%3.i\n", 10); // ' 10' printf("%3.u\n", 10); // ' 10' printf("%3.x\n", 10); // ' a' printf("%3.X\n", 10); // ' A' printf("%#3.x\n", 10); // '0xa' printf("%#3.X\n", 10); // '0XA' }
C
복사
Width < Precision
diuxX
width는 무시되고, precision만큼 칸에 채워넣고 남은 칸에는 0이 채워진다.
#include <stdio.h> int main(void) { printf("%2.3d\n", 10); // 010 printf("%2.3i\n", 10); // 010 printf("%2.3u\n", 10); // 010 printf("%2.3x\n", 10); // 00a printf("%2.3x\n", 10); // 00a printf("%#2.3X\n", 10); // 0x00A printf("%#2.3X\n", 10); // 0x00A }
C
복사
csp
s만 작동한다. cp 모두 . 단독으로만 사용이 가능하다.
#include <stdio.h> int main(void) { printf("%4.3c", 'a'); // compile error printf("%4.3s", "Hello"); // " hel" printf("%4.3p", "a"); // compile error }
C
복사
Width < length && Precision > length || width > length && precision < length
diuxX
precision이든 width든 큰 수만큼 찍힌다. width가 크면 공백이, precision이 크면 0이 찍힌다.
#include <stdio.h> int main(void) { printf("%1.4d\n", 10); // '10' printf("%1.4i\n", 10); // '10' printf("%1.4u\n", 10); // '10' printf("%#1.4x\n", 10); // '0xa' printf("%#1.4X\n", 10); // '0XA' }
C
복사
Precision만 있는 경우
scp
. == .0이에서 s는 출력 안됨
c는 precision 뒤에 숫자 붙이면 에러남
p는 상관없음
#include <stdio.h> int main(void) { printf("%.s\n", "a"); // '' printf("%.c\n", 'a'); // 'a' printf("%.p\n", "a"); // '0x10c49cfa4' }
C
복사

생각해봐야 하는 점

출력할 결과물을 malloc을 사용해서 버퍼에 담아뒀다가 출력할 것인가 vs write로 바로 바로 출력할 것인가
에러가 발생했을 경우 (malloc에 실패했거나 write가 실패했을 경우) ft_printf는 -1을 return해야 한다
출력해야 하는 문자열의 길이가 int 범위를 넘어선다면?