"형식태그와 서식지정자" printf 함수의 옵션 알아보기

이대현·2020년 5월 22일
4

C / CPP

목록 보기
10/28

형식문자열(format)이란?

int ft_printf( const char *format, ... )

표준 출력(stdout) 에 일련의 데이터들을 형식문자열(format)에 지정되어 있는 형태로 출력한다.

형식문자열 다음에는 출력할 데이터들을 쭈르륵 나열해 주면 된다. 이때, 형식 문자열 다음으로 오는 인자들의 개수는 반드시 형식 문자열 속의 형식 태그의 개수보다 같거나 많아야 한다. 이게 무슨 소린가... 아래 설명을 쭉 보면 이해할 수 있다.

(그냥 사용해왔는데 생각보다 복잡했던 프린트에프 구조...)

1. 서식지정자 (format specifier)

ft_printf의 유일한 고정인수 format은 서식문자열, 형식문자열, 포맷 이라고 불린다. 이 포맷은 흔히 우리가 출력하고자 하는 문자열이고, 이 문자열 안에는 % 문자로 시작하는 서식지정자(format specifier) (혹은 서식 문자)가 존재한다. 정수, 실수, 문자, 문자열, 포인터 주소 등을 출력하는 역할을 한다.

이 서식지정자에 다양한 플래그, 폭, 정밀도, 길이 등의 옵션을 조합해서 사용할 수 있다.

2. 형식태그 (format tag)

서식지정자에 옵션을 추가하려면 정해진 형식 태그(format tag) 의 형태를 지켜야 한다. ft_printf의 가변인자 (...) 에 들어오는 인자를 형식태그가 지정한 형태로 치환(대응)되어 출력되는 것이다. 이제 위에서 말했던 가변인자의 개수 >= 형식 태그의 개수 조건이 이해된다.

ft_printf 의 형식태그는 아래와 같은 꼴로 생겼다.

%[flag][width][.precision]서식지정자
  • 형식태그의 첫 번째 문자는 반드시 %문자여야 한다. %문자를 출력해야 한다면 두 번을 중복시켜서 %%와 같이 사용한다.
  • 형식태그는 출력할 값에 대해 각각 적용된다. 출력할 값이 3개라면 %문자 또한 세 번 나와야 한다.
  • 최소한의 형식태그는 %와 서식지정자로 구성된다. [] 로 둘러싸인 부분은 옵션이므로 생략할 수 있다.

⚠ 실제 printf의 형식태그는 정밀도(precision) 다음에 크기(length) 옵션이 추가된다. ft_printf는 printf의 약간 간소화 버전이라고 할 수 있다. 앞으로 정리하는 모든 옵션들은 ft_printf 과제를 기준으로 작성할 것이기 때문에 실제 printf의 옵션을 참고할 때는 여기를 확인...

옵션 별 기능을 하나씩 자세하게 살펴보자

1) 플래그 (flag)

플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 다양한 printf 플래그 중에서 - , 0 , . , * 을 사용 할 수 있어야 한다.

플래그설명
-필드에서 값을 왼쪽으로 정렬한다. 기본은 오른쪽 정렬
0오른쪽 정렬일 때 공백을 0으로 매꾼다.
..n (n은 10진수) 실수일 때 소수점 이하의 자릿 수를 결정한다. 일부 specifier에서만 사용 가능하고 그 외의 값에서는 무시한다. (실수형, 문자열, 정수형에서 사용 가능)
*서식문자로 출력할 인수 앞에 가변인수로 필드의 폭(width)을 결정한다.
  • 여러 개의 플래그를 동시에 사용할 수 있다.
예제
int num = 7;
printf("%0*d", 5, num); >>00007
printf("[%-6d]", 123); >>[123   ]

2) 폭 (width)

  • 출력할 값의 최소 너비(폭)을 지정한다.
  • 출력할 값이 지정한 폭보다 작으면 자릿수를 맞추기 위해 공백 또는 0을 채워 넣는다.
  • 출력할 값이 지정한 폭보다 크면, 값이 잘리면 안되기 때문에 width 옵셥은 무시된다.
  • width에 음수가 할당되면 -플래그(좌측정렬) + width로 간주한다.
폭을 지정하는 두 가지 방법
  1. [숫자] : % 뒤에 나오는 10진수 숫자가 곧 지정한 폭이 된다.
  2. [*] : 숫자 와일드카드. 가변인자로 폭을 지정한다.

여기서 주의할 점은, 필드의 폭을 지정할 때 1번처럼 변환 문자 앞에 숫자로 적던지, * 와일드카드로 인수로 받던지 둘 중 하나만 가능하다. 동시에 사용 불가!

예를 들어,

printf("%3d", 123) OR printf("%*d", 3, 123) 둘 중 하나만 허용.

3) 정밀도 (precision)

  • 출력할 값의 정확도를 위한 자릿수를 설정한다. 즉, 몇 자리까지 출력해야 된는지.

  • 꼭 앞에 마침표(.) 를 찍어야 한다. 폭과 구분하기 위해서.

  • 형식 문자열에서 정밀도를 나타내지는 않지만 뒤에 인자로 정밀도 값을 준다. 이 때 인자는 형식 태그가 적용되는 데이타 앞에 있어야 한다.

  • 출력할 값이 정수(d, i)일 때

    최대 자릿수를 맞추기 위해 0을 추가한다. 자릿수가 출력할 값보다 작을 경우에는 정밀도 옵션을 무시한다.

  • 출력할 값이 실수일 때

    소수점 이하의 최대 자릿수를 가리키고, 자릿수에 따라 반올림이 되거나 소수점 이하에 0이 추가된다. 실수 전체의 자릿수 설정은 width옵션을 사용한다.

  • 정밀도에 음수가 할당되면 무시한다.

  • 정밀도가 정밀도이면서 동시에 서식지정자인 경우 ... X

    예를 들어,

    printf("%.d", 7); >>7

    0000007 이 출력되나 싶었지만 그냥 7만 출력됨.

4) 서식지정자 (type)

type출력 형태예시
c문자a
d or i부호 있는 10진법으로 나타난 정수392
s문자열sample
p포인터 주소B800:0000
u부호없는 10진법으로 나타낸 정수 (unsigned int)7235
x부호없는 16 진법으로 나타낸 정수 (소문자 사용)7fa
X부호없는 16 진법으로 나타낸 정수 (대문자 사용)7FA
profile
삽질의 기록들 👨‍💻

0개의 댓글