c언어 - printf()의 서식지정자(format specifier)와 플래그
42Seoul/c언어

c언어 - printf()의 서식지정자(format specifier)와 플래그

서식지정자란?

먼저, printf()는 다음과 같은 형태로 정의되어있습니다.

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

printf()가 가변 인수 '...'으로부터 넘겨받은 변수들을 출력하기 위해서는, 각 변수의 자료형에 대한 정보가 필요합니다. 이러한 정보를 안내하는 것이 '%'기호로 시작하는 서식지정자이며, 다양한 플래그를 활용하면 넓이, 좌우 정렬 등의 출력 형태도 설정할 수 있습니다.

 

%[플래그][넓이][.(정밀도)][길이]서식지정자

여기서 '%서식지정자'는 서식지정자를 사용할 때 필수 요소이지만, 그 밖의 플래그나 넓이 등의 옵션은 선택사항입니다.

 

 

서식지정자

실제 printf()에는 더 많은 서식지정자들이 있지만, 우선은 ft_printf에서 요구하는 서식지정자들 위주로 정리하였습니다.

 

% '%'문자를 출력하고자 할 때는, '%%'와 같이 두번 입력
c 문자(ASCII코드 값)
s 문자열
d(=i) 부호가 있는 10진 정수
u 부호가 없는 10진 정수
x 부호가 없는 16진 정수(알파벳 소문자)
X 부호가 없는 16진 정수(알파벳 대문자)
p 포인터. 메모리 주소.
n 현재까지 출력한 문자의 개수(int 포인터를 인수로 받음)
f 소수점을 표기하는 실수(알파벳 소문자)
e 지수 표기법으로 표기하는 실수(알파벳 소문자)
g %f와 %e중 길이가 짧은 것(알파벳 소문자)

 

 

플래그와 그 외 옵션들

여기서는 ft_printf를 구현하며 직접 다뤄보았던 'c, s, p, d, i, u, x, X, %'와 width옵션, -0.*등의 조합만을 자세하게 다룹니다. (적용범위와 비고란에는 직접 ft_printf를 구현하며 얻은 정보를 정리했습니다.)

 

플래그 해설 적용 범위 비고
- 왼쪽 정렬. 기본 설정은 오른쪽 정렬 %cspdiuxX등 대부분에 적용 가능 width가 없을 경우, 변화 없음
0 변수의 길이가 width보다 작으면, 남는 공간을 0으로 채움 %diuxX등 정수형에 적용 가능 width가 없을 경우, 변화 없음
변수의 길이에 음수(-)부호 길이가 포함 됨

 

옵션 해설 적용 범위 비고
넓이 출력될 값의 최소 넓이(폭).
변수의 길이가 width보다 작으면, 남은 공간을 ' '공백으로 채움
%cspdiuxX등 대부분에 적용가능 숫자를 *문자로 대체 가능
. .뒤에 따라오는 수만큼, 소수점 아래 자리를 출력 실수형에 적용 가능

<그 외>
-%s : 지정된 길이보다 문자열의 길이가 길면, 지정된 길이만큼만 출력
-%diuxX : 지정된 길이만큼, 숫자 앞을 0으로 채움
-%c : .뒤에 숫자가 없으면 사용 가능하나, 변화 없음
숫자를 *문자로 대체 가능.
지정된 숫자가 없으면 0을 의미.

<%diuxX>

변수의 길이에 음수(-)부호 길이는 포함하지 않음
변수 값이 0일 때, 옵션 값도 0이면, 아무 것도 출력하지 않음(넓이는 출력)

* width나 .처럼 숫자가 필요한 옵션에서, 숫자를 *로 대체.
가변인수로 *에 값을 전달
  width나 .옵션의 자리에 사용

 

 

예제

다음은 몇 가지 플래그와 옵션들의 적용 예시입니다.

#include <stdio.h>

int main()
{
	/* width옵션과 .옵션의 비교 */
	printf("1 |%03d|\n", -1);
	printf("2 |%.3d|\n", -1);
	printf("3 |%5.3d|\n", -1);

	/* .0옵션과 정수 0 */
	printf("4 |%.0d|\n", 0);

	/* .옵션과 %s  */
	printf("5 |%.3s|\n", "hello");

	return (0);
}

출력결과