% | [ flag ] | [ width ] | [ precision ] | type |
---|---|---|---|---|
(필수) | - , 0 |
10진 정수 혹은 * |
.10진 정수 혹은 .* |
cspdiuxX% (필수) |
[ ]
는 필수 아닌 옵션- 만약 옵션이 들어온다면
flag
,width
,precision
순서대로 들어온다. (잘못된 인자 예외처리 X)
type | 설명 | va_arg |
---|---|---|
c |
문자 | int |
s |
문자열 | char * |
p |
포인터 주소 | long long |
d , i |
부호 있는 10진 정수 | int |
u |
부호 없는 10진 정수 | unsigned int |
x , X |
16진수 (소/대문자) | unsigned int |
% |
% 기호 |
- 문자형은
char
형이 아니라int
로 받는다. - 포인터 주소는 16진수로 이루어져 있다. (문자열 X)
type
은%
뒤에 반드시 나와야 한다. (잘못된 인자 예외처리 할 필요 X)type
이s
일 때, 인자에NULL
값이 들어오면,'(null)'
이라는 문자열을 출력해야한다. 이 문자열은precision
과width
,-
flag에 영향을 받는다.
flags | 설명 |
---|---|
- |
왼쪽 정렬 (디폴트는 오른쪽 정렬) |
0 |
type 이 diuxX% 일 때 빈칸 대신 0 으로 채운다 |
flag
는 여러번 들어올 수 있다. 여러번 들어와도 한번만 들어온 것으로 인식한다.- 한가지 경우를 제외하고,
-
과0
는 동시에 들어올 수 없다. (만약 들어오면 컴파일 에러) type
이%
일 때만,-
과0
이 같이 들어올 수 있는데, 이때는 들어온 순서에 상관없이-
가0
보다 우선이다.flag
0
은 숫자(diuxX
)와 기호%
가 오른쪽 정렬(디폴트)일 경우만 적용된다.- 왼쪽 정렬일 경우 수가 달라지기 때문에 성립하지 않는다.
csp
일 경우 input 이0
인 경우와 구분할 수 없어 성립하지 않는다.di
일 때, 만약 인자가 음수라면0
은 '-'와 숫자 사이('-' 뒤, 숫자 앞)에 채워지게 된다.
width | 설명 |
---|---|
10진 숫자 | 양수만 가능하다. (0이면 0 flag로 인식하고, 음수면 - flag로 인식한다.) |
* |
* 을 사용할 경우, 형식문자열이 아닌 가변인자에 정수를 적어줘야 한다. (10진 숫자와 같이 쓰일 수 없다.) |
- 만약 10진 정수에 '012'와 같이 '0'이 맨 앞에 들어간 수를 집어넣으면,
0
flag와 숫자 '12'로 나눠서 인식한다. 즉,width
는 12로 적용된다. *
의 경우 정수에 0이 들어오면 아무런 일도 하지 않는다. 음수가 들어올 경우,-
flag와 양수로 나눠서 인식한다. ('-0'은 그냥 영으로 인식 된다.)*
는 '10진 정수'와 달리 가변 인수 앞에0
을 붙여도 (예를 들어 '012') 앞의 '0'을0
flag로 인식하지 않고 8진 정수로 인식하여 컴파일 에러가 난다.width
가 원래 출력할 문자열보다 작거나 같으면 (width
<=len
) 아무런 일도 하지 않고 원래 문자열을 그대로 출력한다. (만약precision
옵션이 있다면precision
을 적용한 문자열 길이와 비교해야한다.)type
이di
일 때, 만약 인자가 음수라면 문자열의 길이는 '-'를 포함한 길이이며,flag
로0
이 들어왔다면 '-'와 숫자 사이('-' 뒤, 숫자 앞)에 '0'이 채워지게 된다. (예를 들어%05d
이고, 인자가-123
이라면,len
은 4이고, 결과값은-123
->-0123
이다.precision
옵션과 다르므로 주의)width
>len
이면, 차이(len - width)만큼 앞의flag
와precision
에 따라 빈칸(혹은0
)이 채워진다. (오른쪽 정렬이 디폴트이므로-
flag가 없다면 빈칸이 왼쪽에 채워진다)0
과-
flag가 동시에 들어온다면-
(왼쪽 정렬)가 우선이다.
precision | 설명 |
---|---|
. |
width 의 10진 정수와 구분하기 위해 . 뒤에 10진 정수를 쓴다. (type 이 cp% 인 경우, 옵션이 적용되지 않는다.) |
.* |
.* 을 사용할 경우, 형식문자열이 아닌 가변인자에 정수를 적어줘야 한다. width 의 * 과 구분하기 위해 . 뒤에 * 을 쓴다. (10진 정수와 함께 쓰일 수 없다.) |
type
이cp%
인 경우,precision
옵션이 적용되지 않지만,*
로precision
을 받을 경우 적용하지 않더라도 가변인자를 받아야한다. (단,p
일 때는 주소와precision
이 모두 '0' 인 경우에 예외적으로 옵션에 영향을 받는다.)precision
옵션을 사용할 경우.0
flag는 무시한다. (단, 기호%
는precision
옵션을 무시하므로,0
flag를 무시할 수 없다.)precision
을 먼저 적용하고, 그 길이를width
값과 비교하여 최종적으로 출력한다. 이때 문자열(s
)과 숫자(diuxX
)의 처리가 다르다.precision
< 0- 문자열과 숫자 모두
precision
옵션이 없는 경우로 취급한다. - 따라서
precision
이 음수인 경우,0
flag도 무시하지 않는다.
- 문자열과 숫자 모두
precision
== 0- 숫자(
diuxX
) : 원래 문자열을 그대로 출력.- 만약 숫자도 '0'이면 아무것도 출력하지 않는다. ('0' 출력X)
- 문자열(
s
) : 아무것도 출력하지 않는다. - 포인터 주소(
p
) :NULL
인 경우에만 '0x' 출력 ('0x0' 아님)
- 숫자(
precision
에 아무것도 입력되지 않은 경우, 즉.
뒤에*
도 10진 정수도 오지 않으면,precision
== 0 인 경우와 동일하다.- 0 <
precision
<len
- 숫자(
diuxX
) : 원래 문자열을 그대로 출력. - 문자열(
s
) :len
만큼 잘려서 출력. 앞에서 부터 출력되며, 뒤가 잘린다. (예를 들어precision
이 4이고len
이 5라면,"abcde"
->"abcd"
)
- 숫자(
- 0 <
len
<precision
- 숫자(
diuxX
) : 차이(precision - len)만큼 숫자 앞에 0이 채워진다. 숫자가 음수일 경우width
가 길이를 재는 방식과 달리 '-'를 제외하고 숫자의 길이만을 재며, 0은 '-' 부호와 숫자 사이에 들어간다. (예를 들어precision
이 5이고 인자가-123
이라면,len
은 3이고, 결과값은-123
->-00123
이다.) - 문자열(
s
) : 원래 문자열을 그대로 출력.
- 숫자(
- 조건에 따라 새로 만들어진 새로운 문자열 길이(예를 들어,
"abcde"
->"abcd"
또는,-123
->-00123
)를width
와 비교한 뒤, 조건에 맞춰 출력한다.-
과0
flag도 놓치지 말고 고려할 것.