<ft_printf>
Intorduction
이 프로젝트는 꽤 간단합니다. 여러분은 printf 함수를 다시 구현할 것입니다. 희망컨대 여러분들은 cheating의 두려움 없이 추후 프로젝트에서 ft_printf를 재사용할 수 있습니다.
Mandatory part
Program name | libftprintf.a |
Turn in files | *.c, /.c, *.h, /.h, Makefile |
Makefile | all, clean, fclean, re, bonus |
External functs. | malloc, free, write, va_start, va_arg, va_copy, va_end |
Libft authorized | yes |
Description | 실제 printf의 모방 함수인 ft_printf가 포함된 라이브러리를 작성하십시오 |
- ft_printf의 프로토타입은 int ft_printf(const char , …); 이어야 합니다.
- 당신은 libc의 printf 함수를 다시 구현해야 합니다.
- 실제 printf 함수처럼 버퍼 관리를 수행해서는 안 됩니다.
- 다음과 같은 서식 지정자들을 구현할 것입니다: cspdiuxX%
- 모든 서식문자에서 ‘-0.*’ 플래그와 최소 필드 너비의 조합을 어떤 조합도 처리할 것입니다.
- 실제 printf 함수와 비교될 것입니다.
💡 man 3 printf / man 3 stdarg
Bonus part
- 만약 필수적으로 해야하는 부분들이 완벽하지 않다면, 보너스에 대해서는 생각조차 안 할 것입니다.
- 보너스를 모두 구현할 필요는 없습니다.
- 다음 서식 지정자 중 하나 이상을 구현하십시오 : nfge
- 다음 플래그 중 하나 이상을 구현하십시오 : l ll h hh
- 다음 플래그를 모두 구현하십시오 : '# +' (플래그 중 하나는 공백이 맞습니다.)
printf() 함수
printf() 함수는 C언어의 표준 출력 함수로, 여러 종류의 데이터(data)를 다양한 서식에 맞춰 출력할 수 있게 해준다.
printf() 함수의 원형은 다음과 같다.
함수 원형
#include <stdio.h>
int printf(const char * restrict format, ...);
printf() 함수의 f는 formatted의 약자이며, 서식화된 출력을 지원한다는 의미이다.
이 함수는 출력할 데이터를 어떤 서식에 맞춰 출력할지 서식 지정자(format specifier)를 통해 직접 지정할 수 있다.
서식 지정자(format specifier)
서식 지정자 | 출력 데이터 형태 |
%c | 하나의 문자 |
%s | 문자열 |
%d | 부호 있는 10진 정수 |
%i | 부호 있는 10진 정수 (%d와 동일) |
%f | 고정 소수점으로 표현한 실수 (소수점 이하 6자리까지 표현) |
%o | 부호 없는 8진 정수 |
%u | 부호 없는 10진 정수 |
%x | 부호 없는 16진 정수 (소문자 사용) |
%X | 부호 없는 16진 정수 (대문자 사용) |
%e | 부동 소수점으로 표현한 실수 (e-표기법) |
%E | 부동 소수점으로 표현한 실수 (E-표기법) |
%g | 값에 따라 %f나 %e를 사용함. |
%G | 값에 따라 %f나 %E를 사용함. |
%% | 퍼센트(%) 기호 출력 |
형식태그의 틀
%[flag][width][.precision]서식지정자
flag | 설명 |
- | 왼쪽 정렬 |
+ | 양수일 때는 + 부호, 음수일 때는 - 부호 출력 |
공백 | 양수일 때는 부호를 출력하지 않고 공백으로 표시, 음수 일 때는 - 부호 출력 |
# | 진법에 맞게 숫자 앞에 0, 0x, 0X를 붙임 |
0 | 출력하는 폭의 남는 공간에 0으로 채움 |
width | 설명 |
숫자 | 지정한 숫자만큼 폭을 지정하여 출력, 실수는 . (점), e+까지 폭에 포함됨 |
precision | 설명 |
.숫자 | 지정한 숫자만큼 소수점 아래 자리 출력 |
1) 플래그 (flag)
플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 다양한 printf 플래그 중에서 - , 0 , . , * 을 사용 할 수 있어야 한다.
- : 필드에서 값을 왼쪽으로 정렬한다. 기본은 오른쪽 정렬
0 : 오른쪽 정렬일 때 공백을 0으로 매꾼다.
. : .n (n은 10진수) 실수일 때 소수점 이하의 자릿 수를 결정한다. 일부 specifier에서만 사용 가능하고 그 외의 값에서는 무시한다. (실수형, 문자열, 정수형에서 사용 가능)
* : 서식문자로 출력할 인수 앞에 가변인수로 필드의 폭(width)을 결정한다.
2) 폭 (width)
출력할 값의 최소 너비(폭)을 지정한다.
출력할 값이 지정한 폭보다 작으면 자릿수를 맞추기 위해 공백 또는 0을 채워 넣는다.
출력할 값이 지정한 폭보다 크면, 값이 잘리면 안되기 때문에 width 옵셥은 무시된다.
width에 음수가 할당되면 -플래그(좌측정렬) + width로 간주한다.
폭을 지정하는 두 가지 방법
[숫자] : % 뒤에 나오는 10진수 숫자가 곧 지정한 폭이 된다.
[*] : 숫자 와일드카드. 가변인자로 폭을 지정한다.
필드의 폭을 지정할 때 1번처럼 변환 문자 앞에 숫자로 적던지, * 와일드카드로 인수로 받던지 둘 중 하나만 가능하다.
사용한 테스터
github.com/Mazoise/42TESTERS-PRINTF
github.com/charMstr/printf_lover_v2
'42Seoul' 카테고리의 다른 글
[42Seoul] Philosophers : 뮤텍스와 세마포어 (0) | 2021.08.14 |
---|---|
[42 Seoul] Minitalk : signal 함수로 IPC(Inter-Process Communication) 구현 (0) | 2021.07.02 |
[42Seoul] Push_Swap : 정렬 알고리즘 구현 (0) | 2021.06.16 |
[42Seoul] ft_server (Docker + LEMP) (0) | 2021.03.01 |
[42Seoul] Netwhat - 네트워크 및 시스템 관리 (0) | 2021.01.23 |