printf 함수에 대해

프로그래밍/C 2018.08.04 댓글 Plorence
printf함수는 기본적으로 stdio.h에 포함되어있고,#include를 해줘야만이 호출이 가능합니다.
printf함수를 간단하게 설명하면 콘솔에 출력해주는 함수입니다.
printf 함수의 의미
 printf의 fformatted(서식이 지정된)을 의미. 따라서 printf라는 함수의 이름에는 '서식이 지정된 형태의 출력' 이라고합니다.

사용자가 나이 정보를 10진수의 형태로, 그리고 16진수의 형태로 문자열 안에 삽입하는 일 따라서 서식을 지정해야 합니다.
%d는 10진수 정수의형태로 출력한다는 의미고,%X는 16진수 정수의 형태로 출력한다는 의미입니다.
%d와%X 같이 이런걸 '서식문자' 라고합니다.

간단한 예
1
2
3
4
5
6
7
8
9
10
11
// ConsoleApplication2.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include <stdio.h>
int main()
{
    printf("제 나이는 10진수로 %d살,16진수로 %X살입니다. \n"19,19);
    return 0;
}
 
printf함수를 통해 출력을 하는 소스코드

위 소스코드에서 서식문자는 2개(%d 와 %X)이고 출력대상은 19,19입니다.
사용법은 꽤나 간단하며 지켜야할 규칙은 서식문자 만큼 출력대상 이 있어야 하는것입니다.
서식문자가 2개가 있다면 출력대상도 그만큼 있어야 한다는 소리입니다.

각 출력대상이 가리키는 서식문자 그림

%d가 첫번째 서식문자,%X 두 번째 서식문자,앞에있는 19 첫 번째 출력대상,뒤에있는 19 두 번째 출력대상입니다.
각 N번째끼리 연관되어 있으며 정리를 해보면 서식문자 %d는 앞에있는 19, 서식문자 %X는 뒤에있는 19를 16진수로 표현하게됩니다.

서식문자 종류와 의미

서식문자
출력대상(자료형)
출력형태
%d
char,short,int
부호 있는 10진수 정수
%ld
long
부호 있는 10진수 정수
%lld
long long
부호 있는 10진수 정수
%u
unsigned int
부호 있는 10진수 정수
%o
unsigned int
부호 있는 8진수 정수
%x,%X
unsigned int
부호 있는 16진수 정수
%f
float,double
10진수 방식의 부동소수점 실수
%Lf
long double
10진수 방식의 부동소수점 실수
%e,%E
float,double
e 또는 E 방식의 부동소수점 실수
%g,%G
float,double
값에 따라 %f와 %e 사이에서 선택
%c
char,short,int
값에 대응하는 문자
%s
char *
문자열
%p
void *
포인트 주소값

16진수 정수를 출력 할때 0x 까지 붙일려면 % #x,%#X을 하면됩니다.
영어를 대문자 로 출력하려면%X,소문자로 할려면 %x를 쓰시면 됩니다.
딱히 외운다기 보다는 실제로 써보면서 어떤식으로 출력이 되는지 확인후에 외우는것이 좋습니다.
특정 서식문자는 뒤에나올 내용에서 배우게 됩니다.
서식문자는 scanf함수를 통한 입력을 받을때에 또한 

e 표기법
프로그램상에서는 지수를 표현할 수 없기 때문에, e표기법을 사용합니다.
1.0 * 10(+20) 을 e표기법으로 바꾸면 1.0e+20 입니다.
1.2 * 10(+12),1.15 * 10(-12)을 바꾸면 1.2e+12 , 1.15e-12가 됩니다.

위에 표에도 나와 있지만,추가로 더 알아두면 좋은 서식문자
  1. %g
     %g는 소수점 이하의 자릿수가 늘어나면 e표기법으로 출력을 합니다.
     소수점이하 자릿수가 6이상이면 e표기법으로,아니면 실수로 표현을 합니다.
     1.23e-3 (1.23앞에 0이 3개가붙어 0.00123 이됩니다.)

  1. %s
     EX)printf("%s,%s,%s \n","AAA","BBB","CCC");
     그냥 서식문자와 인자에맞게 문자열을 출력 하는 서식문자입니다.


필드 폭을 지정하여 정돈된 출력 보이기
%10d 필드 폭을 10칸 확보하고 오른쪽 정렬을 하고 출력을 진행합니다. %-10d 필드 폭을 10칸 확보하고 왼쪽 정렬 하고 출력을 진행합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
// ConsoleApplication2.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//

#include "stdafx.h"
#include <stdio.h>
int main()
{
    printf("%-10s %s %10s \n""AAA""BBB""CCC");
    printf("%10s""AAA");
    return 0;
}
 
정렬하는 예제

결과값

AAA          BBB          CCC
          AAA



만약 서식문자를 사용했는데 출력대상이 없다면?
1
2
3
4
5
6
7
8
9
10
// ConsoleApplication2.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//

#include "stdafx.h"
#include <stdio.h>

int main(){   
printf("제 나이는 10진수로 %d살,16진수로 %X살입니다. \n");    
return 0;
}
 
cs
서식문자를 사용했지만 출력대상이 없는 소스코드

이때는 쓰레기값 이라고 하는 의미없는 값이 출력됩니다. 이 쓰레기 값은 PC마다 다릅니다.


댓글