서식지정자란?
먼저, 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);
}
출력결과
반응형
'42Seoul > c언어' 카테고리의 다른 글
C언어 - 완전 탐색(Brute-force) 알고리즘으로 map에 있는 구멍 찾기 (0) | 2020.10.28 |
---|---|
c언어 - 가변인자란? 가변인자로 간단한 printf() 구현하기 (0) | 2020.10.22 |