'+'
: (flag) 왼쪽에 붙여서 출력
10
: 최소 10자리
5
: 정밀도
hi
: conversion specifier
%10
너비가 10. 총 10자리가 안 된다면 남는 자리는 빈칸으로..
%-
붙이면 왼쪽으로 딱 붙임.
%+
붙이면 양수도 무조건 +
붙여줌.
%(space)
로 놔두면 양수에는 +
안 붙은 상태로 출력.
%X
16진수로 출력.
%#X
0X 붙여서 출력. 이 경우는 16진수로 출력.
%05i
너비는 5, 남는 자리는 빈칸 대신 0
으로 채움.
%*i
앞의 숫자가 별 자리에 들어감. 여기선 7이 들어가서 %7i
꼴이 된다. 그러면 너비는 7이고, 왼 쪽의 남는 네 자리는 빈칸으로 둔다.
#include <stdio.h>
#include <limits.h>
int main()
{
printf("%10i\n", 1234567); // 1234567
printf("%-10i\n", 1234567); //1234567
printf("%+i %+i\n", 123, -123); //+123 -123
printf("% i \n % i \n", 123, -123); //123
//-123
printf("%X\n", 17); //11
// 16진수
printf("%#X\n", 17); //0X11
printf("%05i\n", 123); //00123
printf("%*i\n", 7, 456); // 456
}
%.(number)d
: 정밀도의 최소 숫자. 3이면 최소 3자리 이상 출력되어야 함. 1024는 4자리 이므로 그대로 출력. 5가 오면 4자리의 1024 앞에 0으로 채워줌.
%.(number)f
: float
와 함께 사용되면 의미가 약간 달라진다. f
는 소숫점의 아래의 자리 수를 의미한다. 3이 오면 소숫점 아래에 반올림된 3자리의 수가 출력되어야 한다.
%(n1).(n2)f
n1은 너비, n2는 정밀도를 나타냄.
%.(number)s
string의 경우는 string의 너비를 제한함. 5면 ABCDE
까지만 출력. 숫자를 안 넣게 되면 0과 동일하게 인식. 그러므로 아무것도 출력되지 않는다.
int main()
{
printf("\nPrecision\n");
printf("%.3d\n", 1024); //1024
printf("%.5d\n", 1024); //01024
printf("%.3f\n", 123456.1234567); //123456.123
printf("%.3f\n", 123456.1235); //123456.124
printf("%10.3f\n", 123.45678); // 123.457
printf("%010.3f\n", 123.45678); //000123.457
printf("%.5s\n", "ABCDEFGHIJKLMN"); //ABCDE
printf("%.s\n", "ABCDEFGHIJKLMN");
}
hhd
에 257을 넣었으므로 overflow 발생.
아래의 예제 같은 경우는 x86, x64에 따라 다른 값이 출력된다.
int main()
{
printf("\nPrecision\n");
printf("%hhd %hd %d\n", 257, 257, 257); //1 257 257
printf("%d %lld %lld\n", INT_MAX + 1, INT_MAX + 1, 2147483648LL);
//-2147483648 2147483648 2147483648 (x64)
//-2147483648 -9223372034707292160 21972790693330944 (x86)
return 0;
}