42 CURSUS / ft_printf_02

2021. 6. 19. 09:4942 SEOUL/42 cursus

Printf_format_placeholder

까먹었을까봐 다시 적는 프엪의 형식

%[parameter][flags][width][.precision][length]type

 

Parameter (optional)

Parameter는 Posix 환경에서만 사용 가능하고 C99에서는 불가하다. 필드에 주어진 옵션 값을 통해 va_list에 직접 접근할 수 있다.

// 예를 들어 다음과 같이 _num$를 통해 _num번째 값을 받아올 수 있다.
printf("인자 순서 : %1$d, %2$d\n2번째 : %2$d \n1번째 : %1$d \n", 42, 4242);
    
> 인자 순서 : 42, 4242
> 2번째 : 4242
> 1번째 : 42

 

Flags

다양한 필드 중 가장 앞에 나오는 flags는 출력의 전체 방향을 설정한다.

서식 지정자에 단독으로 사용되기도하며, 다른 필드와 함께 사용되는 경우도 있는데, 다른 필드와 함께 사용할 경우 flags의 옵션이 영향을 받기도 한다.

FLAGS Description Default
- 좌측 정렬로 출력한다. 우측 정렬
+ 양수일 때에는 +, 음수일 때는 -로 표시 음수일 때에만 - 표시
" " (공백) 양수일 때에는 부호를 생략하고 공백으로 표시(default와 다르다)  
0 width 필드에 주어진 옵션에 따라 빈 자리에 0 추가
-와 사용될 경우 좌측 정렬을 하기 때문에 무시
type 필드의 수를 표기하는 d, i, o, u, x, X를 사용할 때
.precision의 정밀도 역시 0으로 채운다.
 
' (apostrophe) 정수와 지수에 천 단위 구분자를 표시한다.  
# 각 진법과 형식에 맞게 0, 0x,0X를 앞에 추가한다.
.precision 필드의 e, E, f, a, A 옵션과 사용되면 소수점도 영향을 준다.
.precision 필드의 g, G 옵션 역시 소수점에 영향을 주고, 0이 잘리지 않게 한다.
type 필드의 c, s, d, i, u 옵션과 사용되면 #을 무시한다.
 

 

Width

말 그대로 출력 너비를 설정하는데 .precision 필드의 옵션과 사용되면 옵션 값을 고려해 너비 값을 적용한다.

WIDTH Description Default
n 숫자를 의미하며, 양수만 들어올 수 있다.
음수를 사용하면 flag 필드의 '-'로 인식하게된다.
우측 정렬
*(asterisk) 양수일 때에는 +, 음수일 때는 -로 표시 음수일 때에만 - 표시

.Precision

.precision은 출력하는 값의 정확도 표기를 위한 필드로, 너비를 나타내는 width(int) 다음에 오기 때문에 꼭 '.'으로  구분해주어야한다.

단독으로 '.'이 사용되기도하며, '.'과 숫자를 조합하여 사용되기도 하는데, 각 경우에는 바로 뒤에 이어지는 type필드의 옵션에 따라 출력이 바뀐다. 또한 width의 값에 따라서도 영향을 받기 때문에, width로 주어진 값과 .precision에 주어진 값에 유의하고, type 필드의 옵션이 무엇인지도 확인해야한다.

 

  type Description
only_. c, p 정확도를 무시하고, type 옵션에 따른 값을 출력한다.
  d, i, o, u, x, X flags 필드로 0이 주어지면 옵션 '0'을 무시한다.
  f, e, E, g, G, a, A 소수점 아래를 출력하지 않으며, 마지막 숫자는 반올림하여 처리한다.
실수 출력을 위한 type 필드의 Default 정밀도는 소수점 이하 6자리이다.
  .s 문자열을 출력하지 않는다.
  .*s 출력할 최대 길이를 인자로 넘겨받아, 해당 길이만큼 문자열을 출력한다.
.num   n은 숫자를 의미하며, 양수만 사용할 수 있다. 만약 음수가 들어온다면 width의 옵션 값을 무시하고
.precision의 값으로 들어온 음수 n만큼을 width의 옵션 값으로 인식한다.
width의 정렬 방식을 따르므로 좌측 정렬을 수행한다.
  c 정확도를 무시하고, type 옵션에 따른 값을 출력한다.
  d, i, o, u, x, X 출력할 최대 자릿수를 지정하게 된다. 자릿수에서 출력할 값의 길이를 뺀 남은 공간은 기본적으로 0으로 출력하게 된다. 
정수 값이 0이고 num이 0이라면 아무것도 출력하지 않는다.
  f, e, E, g, G, a, A 출력할 소수점 자리수를 지정하게 된다. 출력할 자리 직후의 숫자를 반올림하여 자릿수 내에 출력할 수 있도록 한다. 실수 값으로 0.0가 들어오고 num이 0이라면 0을 출력한다.
  s 문자열에서 출력할 최대 길이를 지정하게 된다. 설정한 길이가 문자열보다 크다면 원래 길이의 문자열을 출력한다.
  p 정확도를 무시하고, type 옵션에 따른 값을 출력한다.

 

Length

length 필드는 type 필드 앞에 붙어 서식에 대한 자료형을 지정하고, 지정한 자료형을 통해 인자에 대한 적절한 형 변환을 수행할 수 있도록 해준다.

  d, i u, o, x f, e, g, a c s p n
default int unsigned int double int char * void * int *
h short int unsigned short int         short int *
hh signed char unsigned char         signed char *
l long int unsigned long int   wint_t wchar_t *   long int *
ll long long int unsigned long long int         long long int *

더 많지만 ,, 표 만들기가 넘 힘들당

 

Type

대망의 타입

형식 문자열은 일반 문자열을 포함해 여러 형식 태그들로 이루어져 있으며, 형식 태그는 %로 시작해서 Type으로 끝나게 된다.

%를 제외한 나머지 필드를 모두 포함해 서식 지정자라고 부르는데, type 필드는 '%'와 함께 없어서 안되는 필드이므로 type 필드를 서식 지정자로 보기도 한다.

 

printf로 출력할 어떤 값이 주어졌을 때 type 필드에 따라 값을 해석하는 방식이 달라지게 되는데, length에서 자료형을 명시했다면, type 필드에서는 출력 형식을 명시하게된다.

 

예로 100이라는 수를 10진법에서는 100으로, 8진법에서는 144로, 16진법에서는 64로 출력하는 것처럼 출력 형식을 지정해주는 것이 type 필드의 역할이다.

 

이번에 구현할 type들은 다음과 같다.

 

character Description abbreviation
d, i 부호 있는 10진 정수로 해석 Signed Decimal Integer
u 부호 없는 10진 정수로 해석 Unsigned Decimal Integer
o 부호 없는 8진 정수로 해석 Unsigned Octal
x, X 부호 없는 16진 정수로 해석 Unsigned Hexadecimal Integer
f, F 실수를 10진수 표기법을 사용해 해석 Decimal Floating Point
c 정수를 문자로 해석 Character
s 정수를 문자열로 해석 String of Characters
p 포인터가 참조하고 있는 메모리의 주소값(16진수 8자리) Pointer Address
n 해당 옵션 전까지 printf를 이용해 출력한 문자의 수를 인자로 받은 변수에 할당 Nothing Printed
% %에 이은 %를 이용하여 출력스트림에 % 기호를 출력함 %
반응형

'42 SEOUL > 42 cursus' 카테고리의 다른 글

42 CURSUS / ft_printf_04 (Flow chart)  (0) 2021.07.05
42 CURSUS / ft_printf_03 (Flow chart)  (0) 2021.06.21
42 CURSUS / ft_printf_01(가변 인자와 매크로)  (0) 2021.06.18
42 CURSUS / GET_NEXT_LINE  (0) 2021.06.16
42 cursus / ft_printf _00  (0) 2021.06.16