상세 컨텐츠

본문 제목

[TIL] 3 - 1. 표준 입출력 함수 - printf( )

언어/C

by 민:하 2022. 3. 3. 23:19

본문

 

1. printf( ) 함수의 형식

  • printf("출력양식", 출력대상);    → ex) printf("a = %d\n", a);
  • printf( )함수의 type : int (출력한 문자열의 바이트)    ex) n = printf("abc\n");  // n = 4

2. printf( ) 함수의 변경자

변경자 의 미
10진수 최소의 필드너비 지정    ex) %5d
출력될 데이터가 지정된 크기에 맞지 않으면 크기 무시
.10진수 정밀도     ex) .2f
%f, %e, %g에서는 소수이하 자리수를 의미
%s에서는 프린트될 최대 문자의 개수
%d에서는 출력될 수의 최소개수를 의미, 앞의 여유분에 '0'을 채움    ex)%.5d => 00123
h short형임을 표시    ex) %hu
l long형 또는 double형임을 표시    ex) %ld, %lf
ll long long형임을 표시    ex) %lld, %llu
L long double형임을 표시    ex) %Lf, %10.4Le
* 필드의 너비나 정밀도등을 임의로 지정하고자 할 때 사용    ex) %*d, %*.*f
ex1) printf("%*d\n", b, a);         // b가 *로, a가 %d로
ex2) printf("%*.*lf\n, b, a, fa);    // b가 첫번째 *로, a가 두번째 *로, fa가 %lf로

3. printf( ) 함수의 플래그(flag)

플래그 의  미
- 항목이 필드의 왼쪽부터 시작하여 프린트    ex) %-20s
+ 수치 앞에 부호를 붙여 출력    ex) %+6.2f
공백 수치가 양의 값이면 공백을 음의 값이면 -를 붙여서 출력    ex)%  6.2f
# %o에 대해서는 8진 접두어 0을 %x에 대해서는 16진 접두어 0x를 붙여 출력    ex) %#o, %#x
0 (zero) 수치값 출력 시 여분 공간을 0으로 채워 출력    ex) %08d, %08.3f

4. sprintf( ) 함수의 활용

  • printf( ) : 모니터에 출력
  • sprintf( ) : 문자열에 출력하는 함수. (화면에 나오지 않음)
#include <stdio.h>
int main() {
    char str[100];
    double pi = 3.141592;
    sprintf(str, "원주율 값은 %2.lf 입니다.", pi);
    printf("%s\n", str);
    return 0;
}

5. printf( ) 함수의 버퍼 (정수편)

< print buffer >

  • 출력할 데이터가 저장되는 곳
  • stack 구조 = LIFO
  • 입출력 단위 : 4Byte (int size)씩 입출력
  • RAM의 데이터 영역에 잡힘
#include <stdio.h>
int main() {
    long long lla = 7;
    char ch = 'A';
    short sh = 10;
    int ia = 7;
    printf("%lld %c %hd %d\n", lla, ch, sh, ia);  // print buffer에 저장되는 순서 : ia → sh → ch → lla
    return 0;
}
 

< 저장 과정 >

① int형인 ia가 먼저 print buffer에 저장

② short형인 sh가 print buffer에 저장

      → short는 2byte인데 4byte단위로 저장하는 print buffer 크기를 맞추기 위해 메모리 확장

③ char형인 ch가 print buffer에 저장

      → char은 1byte인데 4byte단위로 저장하는 print buffer 크기를 맞추기 위해 메모리 확장

④ long long형인 lla가 print buffer에 저장

      → long long은 8byte인데 4byte 단위로 저장하는 print buffer 크기를 맞추기 위해 4byte씩 잘라서 저장

      → 앞부분 4byte 먼저 저장, 뒷부분 4byte를 나중에 저장

 

< 출력 과정 >

① 제일 위에 있는 lla 출력 : %lld는 8byte를 원하기 때문에 4byte를 2번 받아 출력

② 그 다음 ch 출력 : %c는 1byte만 원하지만 억지로 4byte를 줌 → %c가 알아서 1byte만 잘라 사용

③ 그 다음 sh 출력 : %s는 2byte만 원하지만 억지로 4byte를 줌 → %s가 알아서 2byte만 잘라 사용

④ 그 다음 ia 출력

 

< 메모리 확장 >

  • signed : sign 비트에 따라 부호 확장 = sign 비트가 1이면 전부 1로, 0이면 전부 0으로 채우기
  • unsigned : zero 확장 = 0으로 전부 채우기

6. printf( ) 함수의 버퍼 (실수편)

#include <stdio.h>
int main() {
    float fa = 3.5;
    double da = 7.2;
    printf("%f, %lf\n", fa, da);
    return 0;
}

 

fa는 4byte인데 왜 8byte를 print buffer에 저장하는가?

실수형은 무조건 byte인 배정도 부동소수로 저장한다.

즉, float → double로 변환

 

float은 단정도 부동소수라 형식이 다른데 어떻게 저장하는가?

임시기억공간에 fa의 값을 배정도 부동소수 형식으로 바꿔 저장하고

이를 print buffer에 넣는다. 단, printf가 끝나면 임시기억공간 해제

 

 

 

< 출력 과정 >

① 제일 위에 있는 fa 출력 : %f는 4byte가 아닌 8byte를 받아서 출력

② 그 다음 da 출력 : %lf이기 때문에 8byte를 받아서 출력

관련글 더보기

댓글 영역