작성: 2020-07-31 수정:
2020-07-31
c언어 printf
c언어 printf 함수에 대한 정리
형식 지정자
printf의 함수는 다음과 같이 구성된다.
%[flag][width][.precision][length]specifier
flags | 설명 |
---|---|
- |
출력 시 왼쪽, (width와 함께 사용) |
+ |
부호를 항상 출력 |
|
양수 일때, 빈칸을 출력 |
# |
8, 16진수 일때, 0, 0x를 같이 출력 |
0 |
width가 있을때, 남는 자리를 0으로 채움 |
width | 설명 |
---|---|
(number) |
해당 크기만큼 자리를 차지 |
* |
width값의 param으로 받을 수 있음 |
.precision | 설명 |
---|---|
.(number) |
정밀도 조정, 숫자 자릿수 만큼 정밀도 보장 |
.* |
precision값을 param으로 받을 수 있음 |
length: 데이터 타입의 길이 표기: (none)
, hh
, h
, l
, ll
, j
, z
, t
, L
specifier: length와 조합하여 사용됨
specifier | 설명 |
---|---|
d i | 정수 표기 |
u o x X | unsigned, 8진수, 18진수 |
f F e E g G a A | 소수 표기, 지수로 표기 |
c | 문자 표기 |
s | 문자열 표기 |
p | 포인터 값을 16 진수 |
ex) c printf("%+10.5hi", 256);
+
: 부호를 항상 표시10
: 총 10칸의 너비를 차지.5
: 소수 5자리 까지 표기hi
: short int 데이터 타입의 크기
printf가 인자를 해석하는 과정
float n1 = 3.14; // 4bytes
double n2 = 1.234; // 8bytes
int n3 = 1024; // 4bytes
// err
printf("%d %d %d\n", n1, n2, n3);
// 정상 출력
printf("%f %f %d\n", n1, n2, n3);
- n1이 double(8bytes)로 변환되고(printf에서 float는 출력전 double로 변환됨), n1, n2, n3가 stack 메모리의 바닥에 저장됨
- 스택에는 n1(8bytes), n2(8bytes), n3(8bytes)가 차례대로 저장되어 있음
- printf %d %d %d가 해석될때, 4bytes, 4bytes, 4bytes 씩 밑에서 읽어나가기 떄문에 의도치 않게 동작
- n1의 절반, 나머지 절반, n2의 절반만 출력됨