ft_printf

hhkim·2021년 6월 9일
0

42cursus

목록 보기
3/20
post-thumbnail

테스터

https://github.com/gavinfielder/pft
https://github.com/Mazoise/42TESTERS-PRINTF
https://github.com/charMstr/printf_lover_v2


서브젝트

int ft_printf(const char *, ...);
  • 구현해야 하는 서식 지정자: cspdiuxX%
  • 구현해야 하는 플래그: -0.* (+ 최소 폭?)
  • 반환값은 출력되는 문자의 개수
    • 출력에 실패하면 음수를 리턴한다.

형식 문자열

%[플래그][][.정밀도]서식 문자
%[flags][width][.precision]specifier
  • 형식 태그의 첫 번째 문자는 반드시 %
    • % 문자를 출력해야 하는 경우 %%와 같이 중복하여 사용해야 함
  • 옵션의 순서는 반드시 지켜야 함
  • 가변인자의 개수는 형식 태그의 개수와 같거나 크다.

플래그(flags)

플래그설명
+양수일 때는 +, 음수일 때는 -를 표시 (기본적으로 음수만 표시)
-좌측 정렬 (기본적으로 우측 정렬)
0width 필드에 주어진 옵션 자리에 맞춰 왼쪽 빈 자리에 0을 추가하고, -와 함께 사용될 경우 좌측 정렬을 하므로 무시하게 된다.
수를 표기하는 서식 지정자 d, i, o, u, x, X와 함께 사용할 때 .precision 필드도 함께 이용하는 경우 주어진 옵션만큼 빈 자리를 0으로 채운다.
(space)양수일 때는 부호를 생략하고 공백으로 표시 (음수일 때는 - 표시)
'(apostrophe)정수와 지수에 천 단위 구분자 표시 (예: 1,000)
#(hash)각 진법과 형식에 맞게 0, 0x, 0X 추가
  • 0precision을 함께 사용하면 precision만 사용한 것과 같은 결과

폭(width)

  • 출력 너비 설정
  • .precision과 함께 사용하는 경우 그 값을 고려하여 너비를 적용한다.
  • 양수만 사용 가능하며, 음수나 0을 사용하면 플래그로 인식된다.
  • *
    • 너비 값을 인자로 받아서 사용
    • -*: 좌측 정렬하고 빈 자리 공백을 오른쪽에 추가
  • 할당된 인자로 받은 값보다 서식 지정자에 따라 대치될 인자로 더 긴 값이 들어오면 원래 길이만큼 출력한다. (값이 잘리지 않음)

정밀도(precision)

  • .은 필수이며 단독으로 사용 가능
  • .과 숫자를 조합하는 경우 서식 지정자에 따라 출력이 바뀐다.
  • *를 사용하여 정밀도를 인자로 받을 수 있다.
  • 정밀도가 음수인 경우 없는 것으로 간주한다.

서식 문자(specifier, type)

  • 데이터의 출력 형식
서식 문자설명
c정수를 문자로 해석
s정수를 문자열로 해석
p포인터가 참조하고 있는 메모리의 주소 값 (8자리의 16진수)
d부호 있는 10진 정수
i부호 있는 10진 정수
u부호 없는 10진 정수
x부호 없는 16진 정수 (소문자)
X부호 없는 16진 정수 (대문자)

가변 인자(Variable Argument)

https://dojang.io/mod/page/view.php?id=577
https://dojang.io/mod/page/view.php?id=578

  • 매개 변수의 개수를 정해두지 않고 원하는 만큼 받아서 사용할 수 있는 인자
  • 가변 인자를 받기 위해서는 필수 인자가 있어야 한다.
    • 필수 인자는 명시적으로, 선택적 인자는 ...으로 나타낸다.
    • 일반적으로 필수 인자에 선택적 인자의 개수를 명시하여 정지 신호를 찾을 수 있도록 한다.
    • 필수 인자를 먼저 명시하며, 선택적 인자 뒤에 다른 매개 변수를 둘 수 없다.

가변 인자 매크로(Variadic Macros)

  • stdarg.h 라이브러리
  • 가변 인자를 가지는 함수를 사용하기 위해서 가변 인자 매크로를 사용한다.
매크로설명
va_list가변 인자 목록, 가변 인자 포인터 (관습적으로 ap라는 이름 사용)
내부적으로 char *로 정의되어 있음
va_start가변 인자 시작주소를 참조하는 포인터 설정
예) va_start(ap, args)
ap는 가변 인자 포인터, args는 마지막 필수 인자
va_arg가변 인자 포인터를 역참조 후, 지정한 데이터 크기만큼 뒤에 있는 다음 인자를 참조
예) va_arg(ap, int)
ap가 참조하는 값을 역참조하고, aptypeof(int)만큼 다음에 있는 값을 참조하도록 한다.
char, short의 경우 int로 대신 쓰고, float의 경우 double로 대신 쓴 후 형변환을 해주어야 한다. (메모리에 값을 쓸 때 32 비트 주소 체계를 사용하기 때문 - 바이트 패딩)
va_end가변 인자를 모두 처리 후 가변 인자를 가리키는 포인터를 NULL로 초기화
예) va_end(ap)
va_copy가변 인자 목록을 복사 (현재 위치를 저장할 때 사용)

참고

https://www.notion.so/ft_printf-10c13274870143959f39d5c349735c94
https://modoocode.com/35

0개의 댓글