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
•
d, i, u, x, X
◦
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
•
d, i, u, x, X
◦
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
복사
•
c, s, p
◦
s만 작동한다. c, p 모두 . 단독으로만 사용이 가능하다.
#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
•
d, i, u, x, X
◦
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만 있는 경우
•
s, c, p
◦
. == .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 범위를 넘어선다면?