int printf(const char *format, ...)
%[parameter][flags][width][.precision][length]type
[option]
n$ | n은 숫자를 의미하며, 대체할 매개 변수의 번호를 의미한다. 제공된 매개 변수를 n$꼴의 형태로 나타내어, 매개 변수를 다른 순서로 여러 번 출력할 수 있다. |
---|
#include <stdio.h>
int main(void)
{
printf("%2$d %2$#x; %1$d %1$#x", 16, 17);
return (0);
}
result -> 17 0x11; 16 0x10
n은 16의 출력을, 2$은 17의 출력을 낼 수 있는 것이다.
default | ||
---|---|---|
-(minus) | 좌측 정렬을 수행한다. | 우측 정렬 |
+(plus) | 양수일 떄는 +, 음수일 때는 - 표시한다. | 음수만 부호표시 |
" "(space) | 양수일 때는 부호를 생략하고 공백으로 표시한다. 단, 음수일 때는 -를 표시한다. | |
0(zero) | width 필드에 주어진 옵션자리에 맞춰 빈 자리에 0을 추가하고, - (minus)와 사용될 경우 좌측 정렬을 하기 때문에 무시하게 된다. | |
type 필드의 수를 표기하는 d, i, o, u, x, X를 사용할 때 .preicison 필드도 함께 이용되면, 주어진 옵션만큼 빈 자리를 0으로 채운다. | ||
'(apostrophe) | 정수와 지수에 천 단위 구분자를 표시한다. ex) 1,000 | |
#(hash) | 각 진법과 형식에 맞게 0, 0x, 0X를 추가한다. | .precision 필드의 e, E, f, a, A 옵션과 사용될 경우 소수점에 영향을 준다. .preicison 필드의 g, G 옵션도 마찬가지로 소수점에 영향을 주고, 0이 잘리는 현상을 방지한다. type 필드의 c, s, d, i, u옵션과 사용되면 #를 무시한다. |
width 필드는 단어 뜻 그대로 출력 너비를 설정한다. .precision 필드의 옵션과 사용되면 옵션 값을 고려하여 너비 값을 적용한다. (.precision에서 자세히 살펴보자.)
n | n은 숫자를 의미하며, 양수만 사용 가능하다. 음수를 사용하면 부호 - 를 flags 필드의 - (minus)로 인식한다. |
---|---|
*(asterisk) | 너비 값을 인자로 받아서 사용한다. * (asterisk)에 할당될 인자로 받은 값보다 서식 지정자에 따라 대치될 인자로 더 긴 값이 들어오면 원래 길이만큼 출력한다. |
너비 값 < 주어진 값의 길이
#include <stdio.h>
int main(void)
{
printf("%*d", 2, 100);
return (0);
}
result -> 100
위 코드는 주어진 너비 값 2를 무시하고 원래 값 100을 출력한다.
너비 값 ≥ 주어진 값의 길이
#include <stdio.h>
int main(void)
{
printf("%*d", 2, 1);
return (0);
}
result -> 1
설명이 길어 생략한다. 출처에 나와있는 표와 예시(토글)를 참고하자.
d 옵션은 부호가 있는 10진 정수를 입력으로 받지만, i 옵션은 부호가 있는 8진, 10진, 16진 정수를 입력으로 받을 수 있다. 단, i 옵션으로 입력을 받을 때는 특정 형식을 맞춰야만 printf 함수 내에서 이를 해석할 수 있다. 아래 코드를 살펴보자.
#include <stdio.h>
int main(void)
{
printf("%d\n", -42); // 10진수
printf("%i\n", -052); // 8진수
printf("%i\n", -0x2a); // 16진수
printf("%i\n", -0x2A); // 16진수
return (0);
}
f & F option' diff
inf, infinity, nan 등 표현가능한 범위 밖의 수들을 표현할 때 f의 경우 -> 소문자로, F의 경우 대문자로 출력한다.
f option : inf, infinity, nan
F option : INF, INFINITY, NAN
n option' example
#include <stdio.h>
int main(void)
{
char len;
printf("hello init 6!%hhn\n", &len);
printf("length : %hhd", len);
return (0);
}
result -> hello init 6!
length : 13 (인자를 포함한다면 14가 나왔어야함.)